UIImageView – 如何获取分配的图像的文件名?

是否有可能读取目前存储在UIImageView中的UIImageView's UIImage的名称?

我希望你可以做一些这样的事情,但还没有弄明白。

 NSString *currentImageName = [MyIImageView getFileName]; 

不。 你不能这样做。

原因是UIImageView实例不存储图像文件。 它存储一个显示一个UIImage实例。 当你从一个文件中创build一个图像时,你可以这样做:

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

一旦完成,就不再有对文件名的引用。 UIImage实例包含数据,不pipe它在哪里。 因此, UIImageView不可能知道文件名。

此外,即使你可以,你永远不会从视图获取文件名信息。 这打破了MVC。

你可以为UIView的任何子类使用setAccessibilityIdentifier方法

 UIImageView *image ; [image setAccessibilityIdentifier:@"file name"] ; NSString *file_name = [image accessibilityIdentifier] ; 

不,不,不,一般来说,这些事情都是可能的。 这只会让你觉得自己像一个肮脏的人。 如果你绝对必须这样做:

  • 用你自己实现的+imageNamed:(NSString*)imageName创build一个类别,通过调用现有的实现并使用这里标识的技术( 如何在对象内部使用objc_setAssociatedObject / objc_getAssociatedObject? )永久地将imageName与UIImage对象关联这是返回。

  • 使用方法Swizzling将所提供的imageNamed:实现交换为Objective-C运行时的方法查找表中的实现。

  • 在任何时候访问与UIImage实例关联的名称(使用objc_getAssociatedObject)。

我可以validation这是有效的,但要注意的是,你无法获得在NIB中加载的UIImage的名字。 看来从NIB加载的图像不是通过任何标准函数调用创build的,所以对我来说这真是个谜。

我将把实施交给你。 使用Objective-C运行时的复制粘贴代码是一个非常糟糕的想法,所以仔细考虑一下你的项目需求,并且只有在必要的时候才能实现。

没有原生的方式来做到这一点; 不过,你可以自己轻松地创build这个行为。

你可以UIImageView并添加一个新的实例variables:

 NSString* imageFileName; 

然后你可以重写setImage ,首先将imageFileName设置为你正在设置的图像的文件名,然后调用[super setImage:imageFileName] 。 像这样的东西:

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

只是因为它不能在本地完成并不意味着这是不可能的:)

不。 没有办法做到这一点本地。 你将不得不inheritanceUIImageView,并添加一个imageFileName属性(当你设置图像时,你设置)。

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

UIImageView不是UIImage保存在加载的图像的文件名。

你也可以

1 :(如上面的Kenny Winker所build议的)UIImageView子类具有fileName属性或

2:用数字命名图像文件(image1.jpg,image2.jpg等),并用相应的数字标记这些图像(image1.jpg为tag = 1,image2.jpg为tag = 2等)或

3:有一个类级别的variables(例如NSString * currentFileName)更新每当你更新UIImageView的图像

这段代码将帮助你: –

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

使用这个:

 NSString *currentImageName = [self getFileName:MyIImageView]; 

您可以使用objective c运行时function将imagename与UImageView相关联。

首先在你的类中导入#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"); 

希望它可以帮助你。

是的,你可以比较下面的代码数据的帮助

 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; } 

我已经处理了这个问题,我已经通过MVCdevise模式解决了,我创build了Card类:

 @interface Card : NSObject @property (strong,nonatomic) UIImage* img; @property (strong,nonatomic) NSString* url; @end 

//然后在DidLoad方法做的UIViewController中:

 // 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 } 

Swift 3

首先将accessibilityIdentifier设置为imageName

 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() 

或者您可以使用恢复标识符,如下所示:

 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" 

基本上在这个解决scheme中,您使用的是恢复标识符来保存图像的名称,以便以后任何地方使用。 如果更新映像,则还必须更新恢复标识符,如下所示:

 myImageView.restorationIdentifier = "newImageName" 

我希望能帮助你,祝你好运!

在下面使用

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