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;