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

时间:2009-11-16 05:36:10

标签: ios objective-c swift uiimageview uiimage

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

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

NSString *currentImageName = [MyIImageView getFileName];

16 个答案:

答案 0 :(得分:100)

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

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

NSString *file_name = [image accessibilityIdentifier] ;

答案 1 :(得分:82)

不。你不能这样做。

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

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

完成此操作后,不再有任何文件名引用。 UIImage实例包含数据,无论它在何处获取。因此,UIImageView无法知道文件名。

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

答案 2 :(得分:16)

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

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

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

答案 3 :(得分:10)

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

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

NSString* imageFileName;

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

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

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

答案 4 :(得分:9)

不。没办法原生那样做。 你将不得不继承UIImageView,并添加一个imageFileName属性(你在设置图像时设置)。

答案 5 :(得分:9)

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

}

答案 6 :(得分:7)

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

你可以

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

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

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

答案 7 :(得分:3)

此代码可以帮助您: -

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

将此用作: -

NSString *currentImageName = [self getFileName:MyIImageView];

答案 8 :(得分:2)

您可以使用objective 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");

希望它对你有所帮助。

答案 9 :(得分: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;
}

答案 10 :(得分:2)

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

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"

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

答案 11 :(得分:1)

  

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

答案 12 :(得分:1)

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

答案 13 :(得分:0)

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

@interface Card : NSObject

@property (strong,nonatomic) UIImage* img;

@property  (strong,nonatomic) NSString* url;

@end

//然后在UIViewController方法中的DidLoad

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

答案 14 :(得分:-1)

使用以下

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

答案 15 :(得分:-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)
}