Frage

Ist es möglich, den Namen einer UIImageView's UIImage zu lesen das ist derzeit in der UIImageView gespeichert?

Ich hatte gehofft, Sie etwas ein bisschen wie dies tun könnte, aber noch nicht herausgefunden.

NSString *currentImageName = [MyIImageView getFileName];
War es hilfreich?

Lösung

Nein. Sie können das nicht tun.

Der Grund dafür ist, dass eine UIImageView Instanz keine Bilddatei speichert. Es speichert eine zeigt eine UIImage Instanz. Wenn Sie ein Bild aus einer Datei zu machen, können Sie etwas tun, wie folgt aus:

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

Sobald dies geschehen ist, gibt es nicht mehr jede Bezugnahme auf die Dateinamen. Die UIImage Instanz enthält die Daten, unabhängig davon, wo sie es. So könnte der UIImageView nicht möglicherweise die Dateinamen kennen.

Auch wenn Sie könnten, würden Sie niemals Dateinamen info aus einer Sicht bekommen. Dass Umbrüche MVC.

Andere Tipps

Sie können setAccessibilityIdentifier Methode für jede Unterklasse von UIView verwenden

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

NSString *file_name = [image accessibilityIdentifier] ;

Nein, nein, nein ... im Allgemeinen sind diese Dinge möglich. Es wird nur Sie wie eine schmutzige Person fühlen. Wenn Sie unbedingt, dies zu tun:

  • Erstellen Sie eine Kategorie mit Ihrer eigenen Implementierung von +imageNamed:(NSString*)imageName, dass Anrufe durch an die bestehenden Implementierung und die Technik hier identifizierten Verwendungen ( Wie verwende ich objc_setAssociatedObject / objc_getAssociatedObject innerhalb eines Objekts? ) dauerhaft zu assoziieren imageName mit dem UIImage-Objekt, das zurückgegeben wird.

  • Verwenden Sie Methode Swizzling die bereitgestellte Implementierung von imageNamed: für Ihre Implementierung in der Methode Lookup zu tauschen Tabelle der Objective-C-Laufzeit.

  • Rufen Sie den Namen, den Sie mit der UIImage-Instanz zugeordnet (mit objc_getAssociatedObject), wann immer Sie es wollen.

kann ich überprüfen, ob das funktioniert, mit dem Vorbehalt, dass Sie nicht die Namen der UIImage des in NIBs geladen bekommen. Es scheint, dass Bilder von NIBs geladen werden, nicht durch irgendwelche Standardfunktionsaufrufe erstellt, also ist es wirklich ein Rätsel für mich.

Ich verlasse die Umsetzung bis zu Ihnen. Copy-Code einfügen, dass die Schrauben mit der Objective-C-Laufzeit eine sehr schlechte Idee ist, so denken Sie sorgfältig über Ihr Projekt Bedürfnisse und implementieren dies nur, wenn Sie müssen.

Es gibt keine native Möglichkeit, dies zu tun; jedoch könnte man leicht dieses Verhalten selbst erstellen.

Sie können UIImageView Unterklasse und eine neue Instanz Variable hinzu:

NSString* imageFileName;

Dann könnte man setImage, erste Einstellung imageFileName an den Dateinamen des Bildes du bist Einstellung außer Kraft setzen, und dann ruft [super setImage:imageFileName]. So etwas wie folgt aus:

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

Nur weil es nicht nativ ausgeführt werden, bedeutet nicht, es ist nicht möglich:)

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

}

Nein. Auf keinen Fall, dass nativ zu tun. Du wirst UIImageView haben, um eine Unterklasse, und fügen Sie eine Eigenschaft imagefilename (die Sie festlegen, wenn Sie das Bild gesetzt).

Weder UIImageView nicht UIImage hält an den Dateinamen des Bildes geladen.

Sie können entweder

1: (wie oben von Kenny Winkern vorgeschlagen) Unterklasse UIImageView eine Eigenschaft File-Namen zu haben, oder

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

3: (. ZB NSString * Current) Haben Sie eine Klassenstufe Variable, die Updates, wenn Sie das Bild des UIImageView aktualisieren

Dieser Code wird Ihnen helfen: -

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

Verwenden Sie diese als: -

NSString *currentImageName = [self getFileName:MyIImageView];

Ja, Sie können mit Hilfe von Daten, wie unter 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;
}

Sie können mit dem UImageView zum Assoziieren Bildnamen Ziel c Runtime-Funktion verwenden.

Ersteinfuhr #import <objc/runtime.h> in der Klasse

dann implementieren Sie den 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");

Hope hilft es Ihnen.

Sie können auch die Wiederherstellung Bezeichner verwenden, wie folgt aus:

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"

Im Grunde genommen in dieser Lösung, die Sie mit der Wiederherstellung Kennung des Image des Namen zu halten, so dass Sie es später überall verwenden können. Wenn Sie das Bild aktualisieren, müssen Sie auch die Wiederherstellung Kennung aktualisieren, wie folgt aus:

myImageView.restorationIdentifier = "newImageName"

Ich hoffe, das hilft Ihnen, viel Glück!

  

Swift 3

Sie zuerst die accessibilityIdentifier als imagename

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

Verwenden Sie dann den folgenden Code ein.

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

Schließlich Die anrufende Art und Weise des Verfahrens zu identifizieren

myImageView.getFileName()

Get Bild Name Swift 4.2

Es gibt einen Weg, wenn Sie Taste Bildnamen vergleichen wollen, dass Sie in Assets haben.

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

Ich habe mit diesem Problem um, ich war es von MVC-Entwurfsmuster gelöst, habe ich Karten-Klasse:

@interface Card : NSObject

@property (strong,nonatomic) UIImage* img;

@property  (strong,nonatomic) NSString* url;

@end

// dann in der UIViewController in der DidLoad Methode zu tun:

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

// für Beispiel

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

// können Sie die Bildnamen überprüfen, so können Sie dies tun:

// zum Beispiel

 NSString * str = @"image.jpg";

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

Verwendung unter

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

Der Code ist Arbeit in swift3 - Schreib Code innerhalb didFinishPickingMediaWithInfo Delegatmethode:

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)
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top