webentwicklung-frage-antwort-db.com.de

UIImageView - Wie erhalte ich den Dateinamen des zugewiesenen Bildes?

Ist es möglich, den Namen eines UIImageView'sUIImage zu lesen, der derzeit im UIImageView gespeichert ist?

Ich hatte gehofft, Sie könnten so etwas tun, aber ich habe es nicht herausgefunden.

NSString *currentImageName = [MyIImageView getFileName];
76
Kuberchaun

Nee. Das kannst du nicht machen.

Der Grund dafür ist, dass eine UIImageView -Instanz keine Bilddatei speichert. Es speichert eine angezeigte Instanz von UIImage. Wenn Sie ein Bild aus einer Datei erstellen, gehen Sie folgendermaßen vor:

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

Sobald dies erledigt ist, gibt es keinen Verweis mehr auf den Dateinamen. Die Instanz UIImage enthält die Daten, unabhängig davon, woher sie stammen. Daher konnte der UIImageView den Dateinamen möglicherweise nicht kennen.

Selbst wenn Sie könnten, würden Sie niemals Dateinameninformationen von einer Ansicht erhalten. Das bricht MVC.

84

sie können die setAccessibilityIdentifier-Methode für jede Unterklasse von UIView verwenden

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

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

Nein, nein, nein ... im Allgemeinen sind diese Dinge möglich. Sie werden sich einfach wie eine schmutzige Person fühlen. Wenn Sie unbedingt müssen, tun Sie Folgendes:

  • Erstellen Sie eine Kategorie mit Ihrer eigenen Implementierung von +imageNamed:(NSString*)imageName, die die vorhandene Implementierung aufruft und die hier angegebene Technik verwendet ( Wie verwende ich objc_setAssociatedObject/objc_getAssociatedObject in einem Objekt? ), um dauerhaft zu arbeiten Verknüpfen Sie imageName mit dem zurückgegebenen UIImage-Objekt.

  • Verwenden Sie Method Swizzling , um die bereitgestellte Implementierung von imageNamed: Für Ihre Implementierung in der Methodensuchtabelle der Objective-C-Laufzeit zu tauschen.

  • Greifen Sie jederzeit auf den Namen zu, den Sie der UIImage-Instanz zugeordnet haben (mithilfe von objc_getAssociatedObject).

Ich kann überprüfen, ob dies funktioniert, mit der Einschränkung, dass Sie die Namen von UIImage nicht in NIBs laden können. Es scheint, dass Bilder, die von NIBs geladen werden, nicht durch Standardfunktionsaufrufe erstellt werden. Für mich ist das also ein Rätsel.

Ich überlasse die Implementierung Ihnen. Das Kopieren und Einfügen von Code, der sich in die Objective-C-Laufzeit einfügt, ist eine sehr schlechte Idee. Denken Sie also sorgfältig über die Anforderungen Ihres Projekts nach und implementieren Sie diesen nur, wenn Sie dies müssen.

18
Ben Gotow

Es gibt keinen systemeigenen Weg, dies zu tun. Sie können dieses Verhalten jedoch leicht selbst erstellen.

Sie können UIImageView in Unterklassen unterteilen und eine neue Instanzvariable hinzufügen:

NSString* imageFileName;

Dann können Sie setImage überschreiben, indem Sie imageFileName zuerst auf den Dateinamen des Bildes setzen, das Sie einstellen, und dann [super setImage:imageFileName]. Etwas wie das:

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

Nur weil es nicht von Haus aus möglich ist, heißt das noch lange nicht, dass es nicht möglich ist :)

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

}
10
iEinstein

Nee. Das ist nativ nicht möglich. Sie müssen UIImageView in eine Unterklasse unterteilen und eine imageFileName -Eigenschaft hinzufügen (die Sie beim Festlegen des Bildes festlegen).

9
Kenny Winker

Weder UIImageView noch UIImage behalten den Dateinamen des geladenen Bildes bei.

Du kannst entweder

1: (wie von Kenny Winker oben vorgeschlagen) Unterklasse UIImageView mit der Eigenschaft fileName oder

2: Benennen Sie die Bilddateien mit Nummern (image1.jpg, image2.jpg usw.) und kennzeichnen Sie diese Bilder mit der entsprechenden Nummer (tag = 1 für image1.jpg, tag = 2 für image2.jpg usw.) oder

3: Verfügen Sie über eine Klassenvariable (z. B. NSString * currentFileName), die jedes Mal aktualisiert wird, wenn Sie das Image von UIImageView aktualisieren

7
Mihir Mathuria

Dieser Code wird Ihnen helfen: -

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

Verwenden Sie dies als: -

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

Ja, Sie können mit Hilfe von Daten wie dem folgenden Code vergleichen

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

Oder Sie können die Wiederherstellungskennung wie folgt verwenden:

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"

Grundsätzlich verwenden Sie in dieser Lösung die Wiederherstellungs-ID, um den Namen des Images zu speichern, damit Sie es später überall verwenden können. Wenn Sie das Image aktualisieren, müssen Sie auch die Wiederherstellungs-ID wie folgt aktualisieren:

myImageView.restorationIdentifier = "newImageName"

Ich hoffe das hilft dir, viel Glück!

2
ThiagoAM

Sie können die Objective C Runtime-Funktion verwenden, um dem UIimageView einen Bildnamen zuzuordnen.

Importieren Sie zuerst #import <objc/runtime.h> In Ihre Klasse

dann implementieren Sie Ihren Code wie folgt:

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

Hoffe es hilft dir.

2
Nishant Tyagi

Schnell 3

Stellen Sie zuerst den accessibilityIdentifier als imageName ein

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

Verwenden Sie dann den folgenden Code.

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

Schließlich ist der Aufruf der Methode zu identifizieren

myImageView.getFileName()
1
Abdul Hameed

Bildname abrufen Swift 4.2

Es gibt eine Möglichkeit, die Namen von Schaltflächenbildern zu vergleichen, die in Assets enthalten sind.

@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

Ich habe mich mit diesem Problem befasst, ich habe es durch MVC-Entwurfsmuster gelöst, ich habe eine Kartenklasse erstellt:

@interface Card : NSObject

@property (strong,nonatomic) UIImage* img;

@property  (strong,nonatomic) NSString* url;

@end

// dann in der UIViewController in der DidLoad Methode:

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

// zum Beispiel

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

// Vielleicht möchten Sie den Bildnamen überprüfen, damit Sie dies tun können:

// zum Beispiel

 NSString * str = @"image.jpg";

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