web-dev-qa-db-fra.com

UIImageView - Comment obtenir le nom de fichier de l'image assignée?

Est-il possible de lire le nom d'un UIImageView'sUIImage qui est actuellement stocké dans le UIImageView?

J'espérais que vous pourriez faire quelque chose comme ça, mais je ne l'ai pas compris.

NSString *currentImageName = [MyIImageView getFileName];
76
Kuberchaun

Nan. Tu ne peux pas faire ça.

La raison en est qu'une instance UIImageView ne stocke pas de fichier image. Il stocke une affiche une instance UIImage. Lorsque vous créez une image à partir d'un fichier, vous procédez comme suit:

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

Une fois que cela est fait, il n'y a plus aucune référence au nom de fichier. L'instance UIImage contient les données, quel que soit leur emplacement. Ainsi, le UIImageView ne pourrait pas connaître le nom du fichier.

En outre, même si vous le pouviez, vous n'obtiendrez jamais d'informations de nom de fichier à partir d'une vue. Cela casse MVC.

84
Jonathan Sterling

vous pouvez utiliser la méthode setAccessibilityIdentifier pour n’importe quelle sous-classe de UIView

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

NSString *file_name = [image accessibilityIdentifier] ;
101
Nizar Ahmed

Non non non… en général, ces choses sont possibles. Cela vous fera simplement vous sentir comme une personne sale. Si vous devez absolument, faites ceci:

  • Créez une catégorie avec votre propre implémentation de +imageNamed:(NSString*)imageName qui fait appel à l'implémentation existante et utilise la technique identifiée ici ( Comment utiliser objc_setAssociatedObject/objc_getAssociatedObject dans un objet? ) pour qu'il soit permanent associe imageName à l'objet UIImage qui est renvoyé.

  • Utilisez Method Swizzling pour échanger la mise en oeuvre fournie de imageNamed: pour votre implémentation dans la table de recherche de méthodes du moteur d'exécution Objective-C.

  • Accédez au nom que vous avez associé à l’instance UIImage (à l’aide de objc_getAssociatedObject) à tout moment.

Je peux vérifier que cela fonctionne, avec l'avertissement que vous ne pouvez pas obtenir les noms de UIImage chargés dans les NIB. Il semble que les images chargées à partir de cartes d'interface réseau ne soient créées par aucun appel de fonction standard. C'est donc un mystère pour moi.

Je vous laisse la mise en œuvre. Copier-coller du code lié à l'exécution d'Objective-C est une très mauvaise idée. Réfléchissez bien aux besoins de votre projet et implémentez-le uniquement si vous le devez.

18
Ben Gotow

Il n'y a pas de moyen indigène de le faire; Cependant, vous pouvez facilement créer ce comportement vous-même.

Vous pouvez sous-classer UIImageView et ajouter une nouvelle variable d'instance:

NSString* imageFileName;

Ensuite, vous pouvez remplacer setImage, en définissant d'abord imageFileName par le nom de fichier de l'image que vous définissez, puis en appelant [super setImage:imageFileName]. Quelque chose comme ça:

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

Ce n’est pas parce que cela ne peut pas être fait en natif que cela n’est pas possible :)

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

}
10
iEinstein

Nan. Pas moyen de faire ça en natif. Vous devrez sous-classer UIImageView et ajouter une propriété imageFileName (que vous définissez lorsque vous définissez l'image).

9
Kenny Winker

Ni UIImageView ni UIImage ne conserve le nom de fichier de l'image chargée.

Vous pouvez soit

1: (comme suggéré par Kenny Winker ci-dessus) sous-classe UIImageView pour avoir une propriété fileName ou

2: nommez les fichiers image avec des nombres (image1.jpg, image2.jpg, etc.) et associez ces images au numéro correspondant (tag = 1 pour image1.jpg, tag = 2 pour image2.jpg, etc.) ou

3: avoir une variable de niveau de classe (par exemple, NSString * currentFileName) qui se met à jour chaque fois que vous mettez à jour l'image de UIImageView

7
Mihir Mathuria

Ce code va vous aider: -

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

Utilisez ceci comme: -

NSString *currentImageName = [self getFileName:MyIImageView];
3
junaidsidhu

Oui, vous pouvez comparer avec l'aide de données comme ci-dessous code

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;
}
2
Hardik Mamtora

Ou vous pouvez utiliser l'identifiant de restauration, comme ceci:

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"

Dans cette solution, vous utilisez essentiellement l'identificateur de restauration pour contenir le nom de l'image, afin que vous puissiez l'utiliser plus tard, n'importe où. Si vous mettez à jour l'image, vous devez également mettre à jour l'identifiant de restauration, comme ceci:

myImageView.restorationIdentifier = "newImageName"

J'espère que cela vous aide, bonne chance!

2
ThiagoAM

Vous pouvez utiliser la fonction Objective C Runtime pour associer un nom d'image à UIimageView.

Première importation #import <objc/runtime.h> Dans votre classe

puis implémentez votre code comme ci-dessous:

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");

J'espère que ça vous aide.

2
Nishant Tyagi

Swift 3

Commencez par définir le accessibilityIdentifier comme imageName

myImageView.image?.accessibilityIdentifier = "add-image"

Ensuite, utilisez le code suivant.

extension UIImageView
{
func getFileName() -> String? {
    // First set accessibilityIdentifier of image before calling.
    let imgName = self.image?.accessibilityIdentifier
    return imgName
}
}

Enfin, la méthode d’appel de la méthode pour identifier

myImageView.getFileName()
1
Abdul Hameed

Obtenir le nom de l'image Swift 4.2

Il existe un moyen de comparer les noms d’image de bouton que vous avez dans les actifs.

@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()
}
1
Doca

J'ai eu affaire à ce problème, j'ai été résolu par modèle de conception MVC, j'ai créé la classe de carte:

@interface Card : NSObject

@property (strong,nonatomic) UIImage* img;

@property  (strong,nonatomic) NSString* url;

@end

// alors dans le UIViewController dans le DidLoad Méthode pour faire:

// init Cards
Card* card10= [[Card alloc]init];
card10.url=@"image.jpg";  
card10.img = [UIImage imageNamed:[card10 url]];

// par exemple

UIImageView * myImageView = [[UIImageView alloc]initWithImage:card10.img];
[self.view addSubview:myImageView];

// pouvez-vous vérifier le nom de l'image pour pouvoir faire ceci:

// par exemple

 NSString * str = @"image.jpg";

 if([str isEqualToString: [card10 url]]){
 // your code here
 }
0
Hasan Sawaed