代码之家  ›  专栏  ›  技术社区  ›  Kuberchaun

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

  •  73
  • Kuberchaun  · 技术社区  · 15 年前

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

    我希望你能做这样的事,但还没弄明白。

    NSString *currentImageName = [MyIImageView getFileName];
    
    16 回复  |  直到 6 年前
        1
  •  82
  •   Jonathan Sterling    15 年前

    不。你不能那样做。

    原因是 UIImageView 实例不存储图像文件。它存储一个显示器 UIImage 实例。当您从文件中生成图像时,您将执行如下操作:

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

    完成此操作后,将不再有对文件名的任何引用。这个 紫外图像 实例包含数据,不管数据是从何处获取的。因此, UIIVIEVIEW 不可能知道文件名。

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

        2
  •  96
  •   j0k gauthamp    12 年前

    可以对uiview的任何子类使用setaccessibilityIdentifier方法

    UIImageView *image ;
    [image setAccessibilityIdentifier:@"file name"] ;
    
    NSString *file_name = [image accessibilityIdentifier] ;
    
        3
  •  16
  •   Community CDub    7 年前

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

    我可以验证这是否有效,但要注意的是,您不能将uiimage的名称加载到nibs中。从笔尖加载的图像似乎不是通过任何标准函数调用创建的,所以这对我来说真的是个谜。

    我将由您来决定实现。复制粘贴与Objective-C运行时相关的代码是一个非常糟糕的主意,因此请仔细考虑项目的需求,只有在必须时才实现这一点。

        4
  •  10
  •   sth    12 年前

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

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

    NSString* imageFileName;
    

    然后你可以覆盖 setImage 第一次设定 imageFileName 设置的图像的文件名,然后调用 [super setImage:imageFileName] . 像这样:

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

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

        5
  •  9
  •   Kenny Winker    15 年前

    不。这在本地是不可能的。 您必须对uiImageView子类,并添加一个ImageFileName属性(在设置图像时设置)。

        6
  •  9
  •   iEinstein    12 年前
    if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]])
    {
    
    }
    
        7
  •  7
  •   Mihir Mathuria    15 年前

    uiImageView和uiImage都不能保存加载的图像的文件名。

    你也可以

    1:(如上面Kenny Winker所建议的)子类uiImageView具有文件名属性或

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

    3:有一个类级变量(例如nsstring*currentfilename),每当更新uiimageview的映像时,该变量都会更新。

        8
  •  3
  •   Meet Doshi SanitLee    9 年前

    此代码将帮助您:

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

    使用如下:

    NSString *currentImageName = [self getFileName:MyIImageView];
    
        9
  •  2
  •   Hardik Mamtora    10 年前

    是的,您可以与下面代码之类的数据进行比较

    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
  •   Meet Doshi SanitLee    9 年前

    可以使用目标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");
    

    希望对你有帮助。

        11
  •  2
  •   ThiagoAM    7 年前

    或者可以使用还原标识符,如下所示:

    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"
    

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

        12
  •  1
  •   Abdul Hameed    7 年前

    斯威夫特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()
    
        13
  •  0
  •   Dharmesh Dhorajiya    9 年前

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

    @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
  •  0
  •   Egzon P.    6 年前

    Swift 4.2,软件开发工具包11.0

    如果要比较资产中的按钮图像名称,有一种方法。

    @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()
    }
    
        15
  •  -1
  •   Nischal Hada    9 年前

    使用如下

     UIImageView *imageView = ((UIImageView *)(barButtonItem.customView.subviews.lastObject));
     file_name = imageView.accessibilityLabel;
    
        16
  •  -1
  •   Niraj Paul    7 年前

    代码在swift3中工作-在didFinishingPickingMediaWithInfo委托方法中写入代码:

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