85

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

我希望你能做这样的事情,但还没有弄清楚。

NSString *currentImageName = [MyIImageView getFileName];
4

16 回答 16

110

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

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

NSString *file_name = [image accessibilityIdentifier] ;
于 2012-09-04T11:19:29.943 回答
91

没有。你不能那样做。

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

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

完成此操作后,将不再有对文件名的任何引用。实例包含数据,无论它从UIImage哪里获得。因此,UIImageView不可能知道文件名。

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

于 2009-11-16T05:39:51.213 回答
20

不不不……总的来说,这些事情都是可能的。它只会让你觉得自己像一个肮脏的人。如果您绝对必须这样做,请执行以下操作:

  • 使用您自己的实现创建一个类别+imageNamed:(NSString*)imageName,调用现有实现并使用此处确定的技术(如何在对象内使用 objc_setAssociatedObject/objc_getAssociatedObject?imageName )与返回的 UIImage 对象永久关联。

  • 使用Method SwizzlingimageNamed:在 Objective-C 运行时的方法查找表中为您的实现交换提供的实现。

  • 随时访问与 UIImage 实例关联的名称(使用 objc_getAssociatedObject)。

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

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

于 2012-12-24T06:18:50.307 回答
11

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

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

NSString* imageFileName;

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

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

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

于 2012-05-22T01:26:10.450 回答
11
if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]])
{

}
于 2013-02-19T11:03:44.757 回答
10

没有。没有办法在本地做到这一点。您将不得不继承 UIImageView,并添加一个 imageFileName 属性(您在设置图像时设置)。

于 2009-11-16T05:37:55.897 回答
8

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

你可以

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

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

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

于 2009-12-17T22:27:02.180 回答
5

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

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"

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

于 2017-05-23T11:03:02.043 回答
4

此代码将帮助您:-

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

将其用作:-

NSString *currentImageName = [self getFileName:MyIImageView];
于 2013-05-29T22:39:55.910 回答
3

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

希望它可以帮助你。

于 2013-12-20T09:32:50.703 回答
3

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

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;
}
于 2014-10-13T07:01:30.887 回答
3

获取图像名称 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()
}
于 2019-02-25T15:21:42.563 回答
2

斯威夫特 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()
于 2017-04-13T10:29:25.143 回答
0

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

@interface Card : NSObject

@property (strong,nonatomic) UIImage* img;

@property  (strong,nonatomic) NSString* url;

@end

//然后在UIViewControllerMethod DidLoadto Do 中:

// 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
 }
于 2013-06-02T18:07:05.503 回答
-1

在下面使用

 UIImageView *imageView = ((UIImageView *)(barButtonItem.customView.subviews.lastObject));
 file_name = imageView.accessibilityLabel;
于 2013-12-05T01:18:28.380 回答
-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)
}
于 2017-11-27T10:00:26.450 回答