Reputation: 30314
Is it possible to read the name of an UIImageView's
UIImage
that's presently stored in the UIImageView
?
I was hoping you could do something kind of like this, but haven't figured it out.
NSString *currentImageName = [MyIImageView getFileName];
Upvotes: 88
Views: 136118
Reputation: 1670
In short:
uiImageView.image?.imageAsset?.value(forKey: "assetName")
UIImage
has an imageAsset
property (since iOS 8.0) that references the UIImageAsset
it was created from (if any).
UIImageAsset
has an assetName
property that has the information you want. Unfortunately it is not public, hence the need to use value(forKey: "assetName")
. Use at your own risk, as it's officially out of bounds for the App Store.
Upvotes: 8
Reputation: 1538
The code is work in swift3 - write code inside didFinishPickingMediaWithInfo
delegate method:
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)
}
Upvotes: -1
Reputation: 1043
Swift 3
First set the accessibilityIdentifier as imageName
myImageView.image?.accessibilityIdentifier = "add-image"
Then Use the following code.
extension UIImageView {
func getFileName() -> String? {
// First set accessibilityIdentifier of image before calling.
let imgName = self.image?.accessibilityIdentifier
return imgName
}
}
Finally, The calling way of method to identify
myImageView.getFileName()
Upvotes: 3
Reputation: 4768
Get image name Swift 4.2
There is a way if you want to compare button image names that you have in assets.
@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()
}
Upvotes: 3
Reputation: 1542
Or you can use the restoration identifier, like this:
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"
Basically in this solution you're using the restoration identifier to hold the image's name, so you can use it later anywhere. If you update the image, you must also update the restoration identifier, like this:
myImageView.restorationIdentifier = "newImageName"
I hope that helps you, good luck!
Upvotes: 6
Reputation: 3580
This code will help you out:-
- (NSString *)getFileName:(UIImageView *)imgView{
NSString *imgName = [imgView image].accessibilityIdentifier;
NSLog(@"%@",imgName);
return imgName;
}
Use this as:-
NSString *currentImageName = [self getFileName:MyIImageView];
Upvotes: 4
Reputation: 9913
You can use objective c Runtime feature for associating imagename with the UImageView.
First import #import <objc/runtime.h>
in your class
then implement your code as below :
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");
Hope it helps you.
Upvotes: 3
Reputation: 619
use below
UIImageView *imageView = ((UIImageView *)(barButtonItem.customView.subviews.lastObject));
file_name = imageView.accessibilityLabel;
Upvotes: -1
Reputation: 173
I have deal with this problem, I have been solved it by MVC design pattern, I created Card class:
@interface Card : NSObject
@property (strong,nonatomic) UIImage* img;
@property (strong,nonatomic) NSString* url;
@end
//then in the UIViewController
in the DidLoad
Method to Do :
// init Cards
Card* card10= [[Card alloc]init];
card10.url=@"image.jpg";
card10.img = [UIImage imageNamed:[card10 url]];
// for Example
UIImageView * myImageView = [[UIImageView alloc]initWithImage:card10.img];
[self.view addSubview:myImageView];
//may you want to check the image name , so you can do this:
//for example
NSString * str = @"image.jpg";
if([str isEqualToString: [card10 url]]){
// your code here
}
Upvotes: 0
Reputation: 1652
Yes you can compare with the help of data like below code
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;
}
Upvotes: 3
Reputation: 2100
if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]])
{
}
Upvotes: 11
Reputation: 14884
No no no… in general these things are possible. It'll just make you feel like a dirty person. If you absolutely must, do this:
Create a category with your own implementation of +imageNamed:(NSString*)imageName
that calls through to the existing implementation and uses the technique identified here (How do I use objc_setAssociatedObject/objc_getAssociatedObject inside an object?) to permanently associate imageName
with the UIImage object that is returned.
Use Method Swizzling to swap the provided implementation of imageNamed:
for your implementation in the method lookup table of the Objective-C runtime.
Access the name you associated with the UIImage instance (using objc_getAssociatedObject) anytime you want it.
I can verify that this works, with the caveat that you can't get the names of UIImage's loaded in NIBs. It appears that images loaded from NIBs are not created through any standard function calls, so it's really a mystery to me.
I'm leaving the implementation up to you. Copy-pasting code that screws with the Objective-C runtime is a very bad idea, so think carefully about your project's needs and implement this only if you must.
Upvotes: 21
Reputation: 1121
you can use setAccessibilityIdentifier method for any subclass of UIView
UIImageView *image ;
[image setAccessibilityIdentifier:@"file name"] ;
NSString *file_name = [image accessibilityIdentifier] ;
Upvotes: 112
Reputation: 4373
There is no native way to do this; however, you could easily create this behavior yourself.
You can subclass UIImageView
and add a new instance variable:
NSString* imageFileName;
Then you could override setImage
, first setting imageFileName
to the filename of the image you're setting, and then calling [super setImage:imageFileName]
. Something like this:
-(void) setImage:(NSString*)fileName
{
imageFileName = fileName;
[super setImage:fileName];
}
Just because it can't be done natively doesn't mean it isn't possible :)
Upvotes: 11
Reputation: 6539
Neither UIImageView not UIImage holds on to the filename of the image loaded.
You can either
1: (as suggested by Kenny Winker above) subclass UIImageView to have a fileName property or
2: name the image files with numbers (image1.jpg, image2.jpg etc) and tag those images with the corresponding number (tag=1 for image1.jpg, tag=2 for image2.jpg etc) or
3: Have a class level variable (eg. NSString *currentFileName) which updates whenever you update the UIImageView's image
Upvotes: 8
Reputation: 18375
Nope. You can't do that.
The reason is that a UIImageView
instance does not store an image file. It stores a displays a UIImage
instance. When you make an image from a file, you do something like this:
UIImage *picture = [UIImage imageNamed:@"myFile.png"];
Once this is done, there is no longer any reference to the filename. The UIImage
instance contains the data, regardless of where it got it. Thus, the UIImageView
couldn't possibly know the filename.
Also, even if you could, you would never get filename info from a view. That breaks MVC.
Upvotes: 91
Reputation: 12087
Nope. No way to do that natively. You're going to have to subclass UIImageView, and add an imageFileName property (which you set when you set the image).
Upvotes: 10