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

Kub*_*aun 78 objective-c uiimageview uiimage ios swift

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

我希望你能做一些像这样的事,但还没弄明白.

NSString *currentImageName = [MyIImageView getFileName];
Run Code Online (Sandbox Code Playgroud)

小智 103

您可以对UIView的任何子类使用setAccessibilityIdentifier方法

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

NSString *file_name = [image accessibilityIdentifier] ;
Run Code Online (Sandbox Code Playgroud)


Jon*_*ing 86

不.你不能这样做.

原因是UIImageView实例不存储图像文件.它存储显示UIImage实例.从文件制作图像时,您可以执行以下操作:

UIImage *picture = [UIImage imageNamed:@"myFile.png"];
Run Code Online (Sandbox Code Playgroud)

完成此操作后,不再引用文件名.该UIImage实例包含数据,无论它在何处获得.因此,UIImageView不可能知道文件名.

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

  • 仅仅因为它打破MVC并不意味着你不应该这样做.毕竟,规则应该被打破;) (59认同)
  • 一些规则是.但是在iPhone和Mac上,你应该始终尽力遵守MVC.他们是自以为是的环境. (10认同)
  • @JonathanSterling对MVC有很多不同的解释 (2认同)

Ben*_*tow 19

不,不,一般来说,这些都是可能的.它会让你觉得自己像个肮脏的人.如果绝对必须,请执行以下操作:

我可以验证这是否有效,但需要注意的是你无法获得在NIB中加载的UIImage的名称.看起来从NIB加载的图像不是通过任何标准函数调用创建的,所以对我来说这真的很神秘.

我要离开你的实施.使用Objective-C运行时的复制粘贴代码是一个非常糟糕的主意,因此请仔细考虑项目的需求,并在必要时实现此目的.


Wen*_*idd 10

没有本地方法可以做到这一点; 但是,您可以自己轻松创建此行为.

您可以子类化UIImageView并添加新的实例变量:

NSString* imageFileName;
Run Code Online (Sandbox Code Playgroud)

然后您可以覆盖setImage,首先设置imageFileName为您正在设置的图像的文件名,然后调用[super setImage:imageFileName].像这样的东西:

-(void) setImage:(NSString*)fileName
{
   imageFileName = fileName;
   [super setImage:fileName];
}
Run Code Online (Sandbox Code Playgroud)

仅仅因为它本身无法完成并不意味着它是不可能的:)


iEi*_*ein 10

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

}
Run Code Online (Sandbox Code Playgroud)

  • 仅代码的答案不是那么有用。请添加一个简短的文本,说明您的代码片段的作用。 (2认同)

Ken*_*ker 9

不.没办法原生那样做.您将不得不子类化UIImageView,并添加一个imageFileName属性(您在设置图像时设置).


Mih*_*ria 7

UIImageView和UIImage都不会保留加载的图像的文件名.

你也可以

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

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

3:有一个类级变量(例如NSString*currentFileName),每当你更新UIImageView的图像时它都会更新


ama*_*our 7

简而言之:

uiImageView.image?.imageAsset?.value(forKey: "assetName")
Run Code Online (Sandbox Code Playgroud)

UIImage有一个imageAsset属性(自 iOS 8.0 起)引用它的UIImageAsset创建来源(如果有)。

UIImageAsset有一个assetName包含您想要的信息的属性。不幸的是它不是公开的,因此需要使用value(forKey: "assetName"). 请自行承担使用风险,因为它已正式超出 App Store 范围。


Thi*_*oAM 6

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

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"
Run Code Online (Sandbox Code Playgroud)

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

myImageView.restorationIdentifier = "newImageName"
Run Code Online (Sandbox Code Playgroud)

我希望对你有帮助,祝你好运!