Подтвердить что ты не робот

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

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

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

NSString *currentImageName = [MyIImageView getFileName];
4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

NSString *file_name = [image accessibilityIdentifier] ;

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

NSString* imageFileName;

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

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

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

Ответ 5

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

}

Ответ 6

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

Ответ 7

Ни UIImageView, ни UIImage не привязаны к имени файла загруженного изображения.

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

1: (как было предложено Kenny Winker выше) подкласс UIImageView имеет свойство fileName или

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

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

Ответ 8

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

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

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

NSString *currentImageName = [self getFileName:MyIImageView];

Ответ 9

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

Надеюсь, это поможет вам.

Ответ 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;
}

Ответ 11

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

let myImageView = UIImageView()
myImageView.image = UIImage(named: "anyImage")
myImageView.restorationIdentifier = "anyImage" // Same name as image name!

// Later, in UI Tests:
print(myImageView.restorationIdentifier!) // Prints "anyImage"

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

myImageView.restorationIdentifier = "newImageName"

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

Ответ 12

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

Ответ 13

Получить имя изображения 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()
}

Ответ 14

У меня есть проблема с этой проблемой, я решил ее с помощью шаблона проектирования MVC, я создал класс карты:

@interface Card : NSObject

@property (strong,nonatomic) UIImage* img;

@property  (strong,nonatomic) NSString* url;

@end

//затем в UIViewController в методе DidLoad:

// init Cards
Card* card10= [[Card alloc]init];
[email protected]"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
 }

Ответ 15

Это что-то вроде хака, но вот что у меня работает:

Если вы напечатаете объект UIImage на консоли, вот что вы получите:

Optional(<UIImage:0x6000033dc7e0 named(nature4.jpg) {684, 1024}>)

Итак, чтобы получить имя изображения, сначала создайте объект String, содержащий информацию, следующим образом:

let imageInfo = String(describing: image)

Теперь вы можете легко получить имя из строки, используя метод подстроки.

Ответ 16

используйте ниже

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

Ответ 17

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