UIImageView-как получить имя файла назначенного изображения?


можно ли прочитать имя UIImageView'sUIImage это в настоящее время хранится в UIImageView?

Я надеялся, что вы могли бы сделать что-то вроде этого, но не понял его.

NSString *currentImageName = [MyIImageView getFileName];
15 69

15 ответов:

Неа. Ты не можешь этого сделать.

причина в том, что UIImageView экземпляр не хранит файл изображения. Он хранит отображается UIImage экземпляра. Когда вы делаете изображение из файла, вы делаете что-то вроде этого:

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

как только это будет сделано, больше нет никакой ссылки на имя файла. Элемент UIImage экземпляр содержит данные, независимо от того, где он получил его. Таким образом,UIImageView не мог знать имя файла.

кроме того, даже если бы вы могли, вы никогда не будет получать информацию о имени файла из представления. Это ломает MVC.

вы можете использовать метод setAccessibilityIdentifier для любого подкласса UIView

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

NSString *file_name = [image accessibilityIdentifier] ;

нет нет нет... вообще такие вещи возможны. Это просто заставит тебя чувствовать себя грязным человеком. Если вы абсолютно должны сделать это:

  • создайте категорию с собственной реализацией +imageNamed:(NSString*)imageName который обращается к существующей реализации и использует метод, указанный здесь (как использовать objc_setAssociatedObject / objc_getAssociatedObject внутри объекта?), чтобы навсегда связать imageName с объектами UIImage объект, который возвращается.

  • использовать Метод Swizzling поменять местами предоставленную реализацию imageNamed: для вашей реализации в таблице поиска метода среды выполнения Objective-C.

  • доступ к имени, связанному с экземпляром UIImage (с помощью objc_getAssociatedObject) в любое время вы хотите его.

Я могу проверить, что это работает, с оговоркой, что вы не можете получить имена UIImage загружены в перья. Оказывается, что изображения, загруженные из NIBs, не создаются с помощью стандартных вызовов функций, поэтому для меня это действительно загадка.

я оставляю реализацию до вас. Копирование-вставка кода, который привинчивается к среде выполнения Objective-C, - очень плохая идея, поэтому тщательно подумайте о потребностях вашего проекта и реализуйте это только в случае необходимости.

нет родной способ сделать это; однако, вы можете легко создать его самостоятельно.

вы можете подкласс UIImageView и добавить новую переменную экземпляра:

NSString* imageFileName;

тогда вы можете переопределить setImage первый параметр imageFileName к имени файла изображения, которое вы устанавливаете, а затем вызываете [super setImage:imageFileName]. Что-то вроде этого:

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

просто потому что это не может быть сделано изначально, не значит, что это невозможно :)

Неа. Нет изначально. Вам нужно будет подкласс UIImageView и добавить свойство imageFileName (которое вы устанавливаете при установке изображения).

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

}

ни UIImageView не UIImage удерживает имя файла загруженного изображения.

вы можете

1: (Как предложил Кенни Винкер выше) подкласс UIImageView, чтобы иметь свойство fileName или

2: назовите файлы изображений с номерами (image1.jpg, image2.jpg и т. д.) и пометить эти изображения соответствующим номером (tag=1 для image1.jpg, tag=2 для image2.jpg etc) или

3: есть переменная уровня класса (например. NSString *currentFileName) который обновляется всякий раз, когда вы обновляете изображение UIImageView

этот код поможет вам:-

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

использовать это как:-

NSString *currentImageName = [self getFileName:MyIImageView];

вы можете использовать функцию objective C Runtime для связывания 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");

надеюсь, что это помогает вам.

да можно сравнить с помощью данных, как показано ниже код

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

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

или вы можете использовать идентификатор восстановления, например:

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"

Я надеюсь, что это поможет Вам, удачи!

Я имею дело с этой проблемой, я был решен с помощью шаблона дизайна 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
 }

использовать ниже

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

код работает в 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)
}