क्या यह संभव है UIImageView's UIImage
कि वर्तमान में संगृहीत एक का नाम पढ़ा जाएUIImageView ?
मैं उम्मीद कर रहा था कि आप इस तरह का कुछ कर सकते हैं, लेकिन यह पता नहीं लगा है।
NSString *currentImageName = [MyIImageView getFileName];
क्या यह संभव है UIImageView's UIImage
कि वर्तमान में संगृहीत एक का नाम पढ़ा जाएUIImageView ?
मैं उम्मीद कर रहा था कि आप इस तरह का कुछ कर सकते हैं, लेकिन यह पता नहीं लगा है।
NSString *currentImageName = [MyIImageView getFileName];
जवाबों:
नहीं। आप ऐसा नहीं कर सकते।
कारण यह है कि एक UIImageViewउदाहरण एक छवि फ़ाइल संग्रहीत नहीं करता है। यह एक UIImageउदाहरण को संग्रहीत करता है । जब आप किसी फ़ाइल से चित्र बनाते हैं, तो आप कुछ ऐसा करते हैं:
UIImage *picture = [UIImage imageNamed:@"myFile.png"];
एक बार यह हो जाने के बाद, फ़ाइल नाम का कोई संदर्भ नहीं रह जाता है। UIImageउदाहरण डेटा की जहां यह समझ में आ गया परवाह किए बिना होता है। इस प्रकार, UIImageViewसंभवतः फ़ाइल नाम नहीं जान सका।
इसके अलावा, यदि आप कर सकते हैं, तो भी आपको फ़ाइल नाम की जानकारी कभी नहीं मिलेगी। जो MVC को तोड़ता है।
आप UIVIV के किसी भी उपवर्ग के लिए setAccessibilityIdentifier विधि का उपयोग कर सकते हैं
UIImageView *image ;
[image setAccessibilityIdentifier:@"file name"] ;
NSString *file_name = [image accessibilityIdentifier] ;
localizeविधि बनाना चाहता हूँ जो बस छवियों के माध्यम से जाती है और छवि नाम पर कुछ regex करती है (मुझे उन्हें बनाने के लिए बहुत अच्छे कारण मिले हैं एक कस्टम मेड UIImage बनाने के बजाय वास्तविक छवियां) .. मैं सोच रहा था कि क्या उद्देश्य-सी में छवियों को स्थानीय बनाने का एक बेहतर क्लीनर तरीका था .. क्योंकि हर कोई एमवीसी के बारे में बात कर रहा है और क्या नहीं
accessibilityDescription
नहीं नहीं नहीं… सामान्य तौर पर ये चीजें संभव हैं। यह सिर्फ आपको एक गंदे व्यक्ति की तरह महसूस कराएगा। यदि आप पूरी तरह से ऐसा करते हैं, तो:
+imageNamed:(NSString*)imageNameमौजूदा कार्यान्वयन के माध्यम से उस कॉल के अपने स्वयं के कार्यान्वयन के साथ एक श्रेणी बनाएं और यहां पहचानी गई तकनीक का उपयोग करता है ( मैं किसी ऑब्जेक्ट के अंदर objc_setAssociatedObject / objc_getAssociatedObject का उपयोग कैसे करता हूं? ) स्थायी रूप से imageNameUIImage ऑब्जेक्ट के साथ संबद्ध है जो वापस आ गया है?
ऑब्जेक्ट-सी रनटाइम की विधि लुकअप तालिका में अपने कार्यान्वयन के लिए प्रदान किए गए कार्यान्वयन को स्वैप करने के लिए विधि स्विज़लिंग का उपयोग करें imageNamed:।
UIImage उदाहरण (objc_getAssociatedObject का उपयोग करके) के साथ जुड़े नाम को कभी भी आप चाहें।
मैं पुष्टि कर सकता हूं कि यह काम करता है, इस चेतावनी के साथ कि आप NII में UIImage के लोड किए गए नाम नहीं पा सकते हैं। ऐसा प्रतीत होता है कि NIB से लोड की गई छवियाँ किसी भी मानक फ़ंक्शन कॉल के माध्यम से नहीं बनाई गई हैं, इसलिए यह वास्तव में मेरे लिए एक रहस्य है।
मैं आपके ऊपर कार्यान्वयन छोड़ रहा हूं। कॉपी-पेस्टिंग कोड जो ऑब्जेक्टिव-सी रनटाइम के साथ पेंच है, एक बहुत बुरा विचार है, इसलिए अपने प्रोजेक्ट की जरूरतों के बारे में सावधानी से सोचें और इसे केवल तभी लागू करें जब आपको करना चाहिए।
UIImageएक विधि को ओवरराइड करने के लिए सिर्फ उपवर्ग क्यों नहीं बनाते हैं ?
+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 }
ऐसा करने का कोई देशी तरीका नहीं है; हालाँकि, आप आसानी से इस व्यवहार को स्वयं बना सकते हैं।
आप UIImageViewएक नया उदाहरण चर जोड़ सकते हैं और जोड़ सकते हैं :
NSString* imageFileName;
फिर आप ओवरराइड कर सकते हैं setImage, पहले imageFileNameउस छवि के फ़ाइल नाम पर सेटिंग कर रहे हैं जिसे आप सेट कर रहे हैं, और फिर कॉल कर रहे हैं [super setImage:imageFileName]। कुछ इस तरह:
-(void) setImage:(NSString*)fileName
{
imageFileName = fileName;
[super setImage:fileName];
}
सिर्फ इसलिए कि यह मूल रूप से नहीं किया जा सकता इसका मतलब यह संभव नहीं है :)
if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]])
{
}
hot dogया नहीं not hotdog।
नहीं। मूल रूप से ऐसा करने का कोई तरीका नहीं है। आप UIImageView को उप-वर्ग करने जा रहे हैं, और एक छवि फ़ाइल गुण जोड़ें (जो आप छवि सेट करते समय सेट करते हैं)।
लोड की गई छवि के फ़ाइल नाम पर न तो UIImageView UIImage नहीं है।
आप या तो यह कर सकते हैं
1: (जैसा कि ऊपर केनी विंकर द्वारा सुझाया गया है) एक फ़ाइल नाम संपत्ति या के पास उपक्लास UIImageView है
2: संख्याओं के साथ छवि फ़ाइलों को नाम दें (image1.jpg, image2.jpg आदि) और संबंधित संख्या के साथ उन चित्रों को टैग करें (image1.jpg के लिए टैग = 1, टैग = image2.jpg आदि के लिए 2) या
3: एक क्लास लेवल वैरिएबल है (जैसे। NSString * currentFileName) जो जब भी आप UIImareView की छवि को अपडेट करते हैं तो अपडेट होता है
यह कोड आपकी सहायता करेगा: -
- (NSString *)getFileName:(UIImageView *)imgView{
NSString *imgName = [imgView image].accessibilityIdentifier;
NSLog(@"%@",imgName);
return imgName;
}
इसका प्रयोग इस प्रकार करें: -
NSString *currentImageName = [self getFileName:MyIImageView];
[image setAccessibilityIdentifier:@"demoFileName.png"] ;और फिर इस विधि को कॉल करें
या आप इस तरह बहाली पहचानकर्ता का उपयोग कर सकते हैं:
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"
मुझे आशा है कि आपकी मदद करता है, शुभकामनाएँ!
हां आप नीचे दिए गए कोड की तरह डेटा की मदद से तुलना कर सकते हैं
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;
}
आप 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");
आशा है कि यह आपकी मदद करता है।
छवि का नाम स्विफ्ट 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()
}
स्विफ्ट 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()
मेरे पास इस समस्या से निपटने के लिए, मुझे इसे 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
}
कोड स्विफ्ट 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)
}