UIImageView - असाइन की गई छवि का फ़ाइल नाम कैसे प्राप्त करें?


82

क्या यह संभव है UIImageView's UIImage कि वर्तमान में संगृहीत एक का नाम पढ़ा जाएUIImageView ?

मैं उम्मीद कर रहा था कि आप इस तरह का कुछ कर सकते हैं, लेकिन यह पता नहीं लगा है।

NSString *currentImageName = [MyIImageView getFileName];

जवाबों:


88

नहीं। आप ऐसा नहीं कर सकते।

कारण यह है कि एक UIImageViewउदाहरण एक छवि फ़ाइल संग्रहीत नहीं करता है। यह एक UIImageउदाहरण को संग्रहीत करता है । जब आप किसी फ़ाइल से चित्र बनाते हैं, तो आप कुछ ऐसा करते हैं:

UIImage *picture = [UIImage imageNamed:@"myFile.png"];

एक बार यह हो जाने के बाद, फ़ाइल नाम का कोई संदर्भ नहीं रह जाता है। UIImageउदाहरण डेटा की जहां यह समझ में आ गया परवाह किए बिना होता है। इस प्रकार, UIImageViewसंभवतः फ़ाइल नाम नहीं जान सका।

इसके अलावा, यदि आप कर सकते हैं, तो भी आपको फ़ाइल नाम की जानकारी कभी नहीं मिलेगी। जो MVC को तोड़ता है।


62
सिर्फ इसलिए कि यह एमवीसी को तोड़ता है इसका मतलब यह नहीं है कि आपको ऐसा नहीं करना चाहिए। नियम तोड़ने का मतलब है, सब के बाद;)
डरपोक

10
कुछ नियम हैं। लेकिन iPhone और Mac पर, आपको हमेशा MVC का पालन करने की पूरी कोशिश करनी चाहिए। वे राय वाले वातावरण हैं।
जोनाथन स्टर्लिंग

ऐसा करना वास्तव में संभव है, लेकिन इसे इमेज-एडिट करने के लिए ऑब्जेक्टिव-सी रनटाइम के साथ स्क्रू करने की आवश्यकता है: (हाँ, बहुत सारे नियमों को तोड़ना ।) यदि आप वास्तव में किसी महत्वपूर्ण कारण से अपनी परियोजना में ऐसा करते हैं, तो नीचे मेरा जवाब देखें।
बेन गोटोव

3
वहाँ @JonathanSterling MVC के कई अलग अलग व्याख्याओं कर रहे हैं
abbood

यह स्विफ्ट
RedEagle2000

109

आप UIVIV के किसी भी उपवर्ग के लिए setAccessibilityIdentifier विधि का उपयोग कर सकते हैं

UIImageView *image ;
[image setAccessibilityIdentifier:@"file name"] ;

NSString *file_name = [image accessibilityIdentifier] ;

1
मैं यहाँ भर आया बस बी / सी मैं एक ऐप बना रहा हूँ जिसमें स्थानीयकृत चित्र हैं .. और मैं एक ऐसी localizeविधि बनाना चाहता हूँ जो बस छवियों के माध्यम से जाती है और छवि नाम पर कुछ regex करती है (मुझे उन्हें बनाने के लिए बहुत अच्छे कारण मिले हैं एक कस्टम मेड UIImage बनाने के बजाय वास्तविक छवियां) .. मैं सोच रहा था कि क्या उद्देश्य-सी में छवियों को स्थानीय बनाने का एक बेहतर क्लीनर तरीका था .. क्योंकि हर कोई एमवीसी के बारे में बात कर रहा है और क्या नहीं
abbood

1
मुझे पता है कि MVC के साथ कोई ठीक नहीं है, लेकिन मुझे परीक्षण के उद्देश्य में इसकी आवश्यकता थी।
राडेक विलकैक

OSX उपयोग के लिएaccessibilityDescription
अनूप वैद्य

क्या इस समाधान में कोई तकनीकी खामी है? यह सबसे सरल, सबसे साफ समाधान की तरह लगता है, इसलिए इसे स्वीकृत उत्तर नहीं माना जाता है?
Crashalot

19

नहीं नहीं नहीं… सामान्य तौर पर ये चीजें संभव हैं। यह सिर्फ आपको एक गंदे व्यक्ति की तरह महसूस कराएगा। यदि आप पूरी तरह से ऐसा करते हैं, तो:

  • +imageNamed:(NSString*)imageNameमौजूदा कार्यान्वयन के माध्यम से उस कॉल के अपने स्वयं के कार्यान्वयन के साथ एक श्रेणी बनाएं और यहां पहचानी गई तकनीक का उपयोग करता है ( मैं किसी ऑब्जेक्ट के अंदर objc_setAssociatedObject / objc_getAssociatedObject का उपयोग कैसे करता हूं? ) स्थायी रूप से imageNameUIImage ऑब्जेक्ट के साथ संबद्ध है जो वापस आ गया है?

  • ऑब्जेक्ट-सी रनटाइम की विधि लुकअप तालिका में अपने कार्यान्वयन के लिए प्रदान किए गए कार्यान्वयन को स्वैप करने के लिए विधि स्विज़लिंग का उपयोग करें imageNamed:

  • UIImage उदाहरण (objc_getAssociatedObject का उपयोग करके) के साथ जुड़े नाम को कभी भी आप चाहें।

मैं पुष्टि कर सकता हूं कि यह काम करता है, इस चेतावनी के साथ कि आप NII में UIImage के लोड किए गए नाम नहीं पा सकते हैं। ऐसा प्रतीत होता है कि NIB से लोड की गई छवियाँ किसी भी मानक फ़ंक्शन कॉल के माध्यम से नहीं बनाई गई हैं, इसलिए यह वास्तव में मेरे लिए एक रहस्य है।

मैं आपके ऊपर कार्यान्वयन छोड़ रहा हूं। कॉपी-पेस्टिंग कोड जो ऑब्जेक्टिव-सी रनटाइम के साथ पेंच है, एक बहुत बुरा विचार है, इसलिए अपने प्रोजेक्ट की जरूरतों के बारे में सावधानी से सोचें और इसे केवल तभी लागू करें जब आपको करना चाहिए।


1
आप UIImageएक विधि को ओवरराइड करने के लिए सिर्फ उपवर्ग क्यों नहीं बनाते हैं ?
व्र्विम

vrwim: जब आप किसी मौजूदा व्यवहार में कुछ जोड़ना चाहते हैं, तो आपको ज़ोर लगाना होगा। यदि आप श्रेणी (या वंशानुक्रम) का उपयोग करेंगे, तो आप कुछ कोड को दूसरे में स्विच करने में सक्षम होंगे, लेकिन आप मूल व्यवहार को खोए बिना ऐसा नहीं कर पाएंगे। दूसरे शब्दों में, यदि आप लिखने की कोशिश करेंगे (विरासत में मिला वर्ग): +imageNamed:(NSString*)imageName { // save file name in new property or whatever [self imageNamed:imageName]; // infinite loop [super imageNamed:imageName]; // super doesn't contain such a method }
yonivav

हाय बेन किसी भी कारण से बस का उपयोग नहीं करने के लिए असफलता के रूप में उपयोग नहीं किया गया है?
Crashalot

10

ऐसा करने का कोई देशी तरीका नहीं है; हालाँकि, आप आसानी से इस व्यवहार को स्वयं बना सकते हैं।

आप UIImageViewएक नया उदाहरण चर जोड़ सकते हैं और जोड़ सकते हैं :

NSString* imageFileName;

फिर आप ओवरराइड कर सकते हैं setImage, पहले imageFileNameउस छवि के फ़ाइल नाम पर सेटिंग कर रहे हैं जिसे आप सेट कर रहे हैं, और फिर कॉल कर रहे हैं [super setImage:imageFileName]। कुछ इस तरह:

-(void) setImage:(NSString*)fileName
{
   imageFileName = fileName;
   [super setImage:fileName];
}

सिर्फ इसलिए कि यह मूल रूप से नहीं किया जा सकता इसका मतलब यह संभव नहीं है :)


इसे आगे बढ़ाने और साइट को साफ रखने में मदद करने के लिए धन्यवाद!
jscs

10
if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]])
{

}

अगर किसी हालत में मैं सिर्फ छवियों के नाम की जाँच कर रहा हूँ
iEinstein

2
कोड-केवल उत्तर इतने उपयोगी नहीं हैं। कृपया एक छोटा पाठ जोड़कर बताएं कि आपका कोड टुकड़ा क्या करता है।
nalply

अगर हालत imageForCheckMark और [UIImage imageNamed: @ "crossCheckMark.png"] में छवि नाम मिलान किया जाता है] अगर सही है तो कोड कोड की अन्यथा अलग लाइन के कुछ लाइन पर अमल
iEinstein

यह हमें यह बताने जैसा है कि क्या छवि है hot dogया नहीं not hotdog
स्कॉट्टीब्लाड्स

यदि सही चित्र सेट हैं, तो यह जाँचने के लिए मैं कुछ यूनीटैस्ट बना रहा हूँ कि मेरे लिए यह उपयोगी है।
MQoder

9

नहीं। मूल रूप से ऐसा करने का कोई तरीका नहीं है। आप UIImageView को उप-वर्ग करने जा रहे हैं, और एक छवि फ़ाइल गुण जोड़ें (जो आप छवि सेट करते समय सेट करते हैं)।


हाय kenny किसी भी कारण से बस का उपयोग नहीं करने के लिए असफलता। के रूप में nizar ahmed द्वारा सुझाव दिया?
Crashalot

7

लोड की गई छवि के फ़ाइल नाम पर न तो UIImageView UIImage नहीं है।

आप या तो यह कर सकते हैं

1: (जैसा कि ऊपर केनी विंकर द्वारा सुझाया गया है) एक फ़ाइल नाम संपत्ति या के पास उपक्लास UIImageView है

2: संख्याओं के साथ छवि फ़ाइलों को नाम दें (image1.jpg, image2.jpg आदि) और संबंधित संख्या के साथ उन चित्रों को टैग करें (image1.jpg के लिए टैग = 1, टैग = image2.jpg आदि के लिए 2) या

3: एक क्लास लेवल वैरिएबल है (जैसे। NSString * currentFileName) जो जब भी आप UIImareView की छवि को अपडेट करते हैं तो अपडेट होता है


3

यह कोड आपकी सहायता करेगा: -

- (NSString *)getFileName:(UIImageView *)imgView{
    NSString *imgName = [imgView image].accessibilityIdentifier;
    NSLog(@"%@",imgName);
    return imgName;
}

इसका प्रयोग इस प्रकार करें: -

NSString *currentImageName = [self getFileName:MyIImageView];

यह अशक्त हो जाएगा क्योंकि आपने पहुँच क्षमता निर्धारित नहीं की है। इसे इस तरह सेट करें [image setAccessibilityIdentifier:@"demoFileName.png"] ;और फिर इस विधि को कॉल करें
NSNoob

कंसोल का कहना है: त्रुटि: संपत्ति 'पहुंच योग्यता' प्रकार 'UIImage *' की वस्तु पर नहीं मिली है - Xcode 8.1
जमाल ज़फर

रिटर्न नल, यह कोशिश मत करो
किंग्सले मिशेल

वैसे भी यह अशक्त है
सरनजीत

3

या आप इस तरह बहाली पहचानकर्ता का उपयोग कर सकते हैं:

let myImageView = UIImageView()
myImageView.image = UIImage(named: "anyImage")
myImageView.restorationIdentifier = "anyImage" // Same name as image's name!

// Later, in UI Tests:
print(myImageView.restorationIdentifier!) // Prints "anyImage"

मूल रूप से इस समाधान में आप छवि का नाम रखने के लिए पुनर्स्थापना पहचानकर्ता का उपयोग कर रहे हैं, इसलिए आप इसे बाद में कहीं भी उपयोग कर सकते हैं। यदि आप छवि को अपडेट करते हैं, तो आपको बहाली पहचानकर्ता को भी अपडेट करना होगा, जैसे:

myImageView.restorationIdentifier = "newImageName"

मुझे आशा है कि आपकी मदद करता है, शुभकामनाएँ!


2

हां आप नीचे दिए गए कोड की तरह डेटा की मदद से तुलना कर सकते हैं

UITableViewCell *cell = (UITableViewCell*)[self.view viewWithTag:indexPath.row + 100];

UIImage *secondImage = [UIImage imageNamed:@"boxhover.png"];

NSData *imgData1 = UIImagePNGRepresentation(cell.imageView.image);
NSData *imgData2 = UIImagePNGRepresentation(secondImage);

BOOL isCompare =  [imgData1 isEqual:imgData2];
if(isCompare)
{
    //contain same image
    cell.imageView.image = [UIImage imageNamed:@"box.png"];
}
else
{
    //does not contain same image
    cell.imageView.image = secondImage;
}

2

आप UImageView के साथ कल्पना को संबद्ध करने के लिए उद्देश्य c रनटाइम सुविधा का उपयोग कर सकते हैं।

पहले #import <objc/runtime.h>अपनी कक्षा में आयात करें

फिर अपना कोड नीचे दिए अनुसार लागू करें:

NSString *filename = @"exampleImage";
UIImage *image = [UIImage imagedName:filename];
objc_setAssociatedObject(image, "imageFilename", filename, OBJC_ASSOCIATION_COPY);
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
//You can then get the image later:
NSString *filename = objc_getAssociatedObject(imageView, "imageFilename");

आशा है कि यह आपकी मदद करता है।


2

छवि का नाम स्विफ्ट 4.2 प्राप्त करें

एक तरीका है यदि आप बटन छवि नामों की तुलना करना चाहते हैं जो आपके पास संपत्ति में हैं।

@IBOutlet weak var extraShotCheckbox: UIButton!

@IBAction func extraShotCheckBoxAction(_ sender: Any) {
    extraShotCheckbox.setImage(changeCheckBoxImage(button: extraShotCheckbox), for: .normal)
}

func changeCheckBoxImage(button: UIButton) -> UIImage {
    if let imageView = button.imageView, let image = imageView.image {
        if image == UIImage(named: "checkboxGrayOn") {
            return UIImage(named: "checkbox")!
        } else {
            return UIImage(named: "checkboxGrayOn")!
        }
    }
    return UIImage()
}

1

स्विफ्ट 3

पहले पहुँच-क्षमता को छविनाम के रूप में सेट करें

myImageView.image?.accessibilityIdentifier = "add-image"

फिर निम्न कोड का उपयोग करें।

extension UIImageView
{
func getFileName() -> String? {
    // First set accessibilityIdentifier of image before calling.
    let imgName = self.image?.accessibilityIdentifier
    return imgName
}
}

अंत में, पहचान करने के लिए विधि का कॉलिंग तरीका

myImageView.getFileName()

0

मेरे पास इस समस्या से निपटने के लिए, मुझे इसे MVC डिजाइन पैटर्न द्वारा हल किया गया है, मैंने कार्ड वर्ग बनाया है:

@interface Card : NSObject

@property (strong,nonatomic) UIImage* img;

@property  (strong,nonatomic) NSString* url;

@end

// तो में UIViewControllerमें DidLoadऐसा करने के लिए विधि:

// init Cards
Card* card10= [[Card alloc]init];
card10.url=@"image.jpg";  
card10.img = [UIImage imageNamed:[card10 url]];

// उदाहरण के लिए

UIImageView * myImageView = [[UIImageView alloc]initWithImage:card10.img];
[self.view addSubview:myImageView];

// क्या आप छवि नाम जाँचना चाहते हैं, इसलिए आप ऐसा कर सकते हैं:

//उदाहरण के लिए

 NSString * str = @"image.jpg";

 if([str isEqualToString: [card10 url]]){
 // your code here
 }

-1

नीचे उपयोग करें

 UIImageView *imageView = ((UIImageView *)(barButtonItem.customView.subviews.lastObject));
 file_name = imageView.accessibilityLabel;

-1

कोड स्विफ्ट 3 में काम करता है - कोड को अंदर लिखेंफिशपिंगमीडियाविथइनफो प्रतिनिधि प्रतिनिधि विधि:

if let referenceUrl = info[UIImagePickerControllerReferenceURL] as? 

NSURL {

  ALAssetsLibrary().asset(for: referenceUrl as URL!, resultBlock: { asset in

    let fileName = asset?.defaultRepresentation().filename()
    print(fileName!)

    //do whatever with your file name            
    }, failureBlock: nil)
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.