UIImageView - Как получить имя файла назначенного изображения? - PullRequest
76 голосов
/ 16 ноября 2009

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

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

NSString *currentImageName = [MyIImageView getFileName];

Ответы [ 16 ]

101 голосов
/ 04 сентября 2012

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

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

NSString *file_name = [image accessibilityIdentifier] ;
83 голосов
/ 16 ноября 2009

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

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

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

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

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

17 голосов
/ 24 декабря 2012

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

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

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

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

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

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

10 голосов
/ 19 февраля 2013
if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]])
{

}
10 голосов
/ 22 мая 2012

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

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

NSString* imageFileName;

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

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

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

9 голосов
/ 16 ноября 2009

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

7 голосов
/ 18 декабря 2009

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

Вы можете либо

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

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

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

3 голосов
/ 30 мая 2013

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

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

Используйте это как: -

NSString *currentImageName = [self getFileName:MyIImageView];
2 голосов
/ 23 мая 2017

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

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 голосов
/ 13 октября 2014

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

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