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


82

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

我希望您可以做这样的事情,但是还没有弄清楚。

NSString *currentImageName = [MyIImageView getFileName];

Answers:


88

不。你不能那样做。

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

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

完成此操作后,将不再引用文件名。该UIImage实例包含的数据,无论它得到了它。因此,UIImageView可能无法知道文件名。

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


62
仅仅因为它破坏了MVC,并不意味着您不应该这样做。毕竟规则应该被打破;)
鬼S 2009年

10
有一些规则。但是在iPhone和Mac上,您应该始终尽力遵守MVC。他们是自以为是的环境。
乔纳森·斯特林

实际上可以执行此操作,但是需要使用Objective-C运行时来编辑imageNamed :(是的,要打破很多规则。)如果由于某些重要原因确实必须在项目中执行此操作,请参见下面的答案。
Ben Gotow 2012年

3
@JonathanSterling对MVC有许多不同的解释
大约

看起来像Swift中的UIImage(名称:String)
RedEagle2000

109

您可以将setAccessibilityIdentifier方法用于UIView的任何子类

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

NSString *file_name = [image accessibilityIdentifier] ;

1
我只是在这里碰到b / c我正在创建一个具有本地化图像的应用程序..我想创建一个localize简单地遍历图像并对图像名称进行一些正则表达式的方法(我有很好的理由来制作这些图像图像的实际图像而不是创建一个定制的UIImage).. ..我想知道是否有本地化在Objective-C图像的更好更清洁的方式,因为每个人都在谈论MVC,什么不可以
abbood

1
我知道MVC不能正常运行,但出于测试目的,我需要它。
Radek Wilczak 2014年

对于OSX使用accessibilityDescription
Anoop Vaidya

该解决方案是否存在技术缺陷?这似乎是最简单,最干净的解决方案,所以为什么不将其视为公认的答案?
Crashalot

19

不不不…一般来说,这些事情都是可能的。它只会使您感到自己像个肮脏的人。如果绝对必要,请执行以下操作:

我可以验证这一点是否有效,但需要注意的是,您无法获取NIB中加载的UIImage的名称。从NIB加载的图像似乎不是通过任何标准函数调用创建的,所以对我来说确实是个谜。

我将实施留给您。与Objective-C运行时相关的粘贴粘贴代码是一个非常糟糕的主意,因此请仔细考虑项目的需求,并仅在必须时实施此需求。


1
您为什么不创建的子类UIImage来覆盖方法?
vrwim

vrwim:当您想向现有行为中添加某些内容时,需要打个招呼。如果您将使用类别(或继承),则可以在其他代码中切换某些代码,但是您将无法做到这一点而又不会丢失原始行为。换句话说,如果您尝试编写(在继承的类中): +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 }
yonivav 2015年

嗨,您有任何理由不只是按照nizar ahmed的建议使用setAccessibilityIdentifier吗?
Crashalot

10

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

您可以继承UIImageView并添加新的实例变量:

NSString* imageFileName;

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

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

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


感谢您移动此文件并帮助保持网站清洁!
jscs 2012年

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

}

如果情况允许,我只是检查图像的名称
iEinstein 2013年

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

如果条件与imageForCheckMark和[UIImage imageNamed:@“ crossCheckMark.png”]]中的图像名称匹配,则为true,然后执行一些代码行,否则执行其他代码行
iEinstein 2013年

这就好比告诉我们无论是形象,如果hot dog还是not hotdog
ScottyBlades

我正在创建一些单元测试来检查是否设置了正确的图像,对我来说这很有用。
MQoder19年

9

不。没有办法自然地做到这一点。您将必须继承UIImageView的子类,并添加一个imageFileName属性(在设置图像时设置)。


嗨,肯尼,有什么理由不只是按照nizar ahmed的建议使用setAccessibilityIdentifier?
Crashalot

7

UIImageView和UIImage都不保留所加载图像的文件名。

你可以

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

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

3:具有一个类级别变量(例如NSString * currentFileName),该变量在您每次更新UIImageView的图像时都会更新


3

此代码将帮助您:-

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

将此用作:-

NSString *currentImageName = [self getFileName:MyIImageView];

由于尚未设置accessibilityIdentifier,它将返回null。像这样设置[image setAccessibilityIdentifier:@"demoFileName.png"] ;,然后调用此方法
NSNoob '16

控制台说:错误:在类型为'UIImage *'的对象上找不到属性'accessibilityIdentifier'-Xcode 8.1
Jamal Zafar

返回Null,请不要尝试此操作
Kingsley Mitchell

无论如何,它返回null
Saranjith

3

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

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"

希望对您有帮助,祝您好运!


2

是的,您可以借助以下代码的数据进行比较

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

2

您可以使用目标c运行时功能将图像名称与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");

希望对您有帮助。


2

获取图像名称Swift 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()
}

1

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

0

我已经解决了这个问题,我已经通过MVC设计模式解决了它,我创建了Card类:

@interface Card : NSObject

@property (strong,nonatomic) UIImage* img;

@property  (strong,nonatomic) NSString* url;

@end

//然后在“要执行UIViewControllerDidLoad方法”中:

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

-1

在下面使用

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

-1

代码在swift3中有效-在didFinishPickingMediaWithInfo委托方法内编写代码:

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)
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.