Est-il possible de lire le nom d'un UIImageView's
UIImage
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];
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.
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] ;
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.
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 :)
if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]])
{
}
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).
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
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];
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;
}
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!
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.
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()
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()
}
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
}