UIImageView – Come ottenere il nome del file di immagine ricevuto?

È possibile leggere il nome di un UIImageView's UIImage
che attualmente memorizzati nel UIImageView?

Speravo si potesse fare qualcosa di simile a questo, ma non l’hanno capito.

NSString *currentImageName = [MyIImageView getFileName];
InformationsquelleAutor Kuberchaun | 2009-11-16

 

16 Replies
  1. 84

    No. Non si può fare.

    Il motivo è che un UIImageView istanza non memorizzare un file di immagine. Memorizza in mostra un UIImage istanza. Quando si crea un’immagine da un file, fare qualcosa di simile a questo:

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

    Una volta fatto questo, non vi è più alcun riferimento al nome del file. Il UIImage istanza contiene i dati, indipendentemente da dove l’ha preso. Così, il UIImageView non ha la possibilità di conoscere il nome del file.

    Inoltre, anche se si potrebbe non ottenere il filename info da un punto di vista. Che rompe MVC.

    • Solo perché si rompe MVC non significa che non si dovrebbe fare. Le regole sono fatte per essere infrante, dopo tutto 😉
    • Alcune regole sono. Ma su iPhone e Mac, si dovrebbe sempre fare del tuo meglio per rispettare MVC. Sono supponente ambienti.
    • In realtà è possibile fare questo, ma richiede l’avvitamento con l’Obiettivo-C runtime per modificare imageNamed: (sì, breaking un sacco di regole). Se si deve fare questo nel tuo progetto per alcune ragioni importanti, vedi la mia risposta qui sotto.
    • ci sono molte diverse interpretazioni di MVC
    • Sembra che UIImage(nome: String) in Swift
    • era setAccessibilityIdentifier come suggerito da nizar ahmed risposta qui sotto non disponibile nel 2009, o c’è una ragione per non utilizzare setAccessibilityIdentifier?

  2. 101

    è possibile utilizzare setAccessibilityIdentifier metodo per ogni sottoclasse di UIView

    UIImageView *image ;
    [image setAccessibilityIdentifier:@"file name"] ;
    
    NSString *file_name = [image accessibilityIdentifier] ;
    • mi sono imbattuto qui semplicemente b/c sto creando un’app che ha localizzato le immagini.. e voglio creare un localize metodo che va semplicemente attraverso le immagini e fa un po ‘ di regex sul nome dell’immagine (ho avuto buoni motivi per fare quelle immagini immagini reali, piuttosto che la creazione di un custom made UIImage).. mi chiedevo se c’è stato un migliore senso più pulito di localizzazione di immagini in objective-c.. dal momento che tutti parlano di MVC e cosa non
    • So che non c’è ok con MVC, ma avevo bisogno di farlo a scopo di test.
    • Per OSX uso accessibilityDescription
    • c’è una tecnica svantaggio di questa soluzione? questo mi sembra il più semplice, più pulito soluzione così perché non è considerato accettato di rispondere?
  3. 18

    No No No… in genere queste cose sono possibili. Ti basta ti fanno sentire come uno sporco persona. Se è assolutamente necessario, fare questo:

    • Creare una categoria con la propria implementazione di +imageNamed:(NSString*)imageName che chiamate attraverso l’implementazione esistente e utilizza la tecnica qui individuati (Come faccio a utilizzare objc_setAssociatedObject/objc_getAssociatedObject all’interno di un oggetto?) per associare in modo permanente imageName con il UIImage oggetto che viene restituito.

    • Utilizzare Metodo Swizzling per invertire la condizione attuazione di imageNamed: per l’implementazione nel metodo di ricerca tabella di Objective-C runtime.

    • Accesso il nome che è associato con il UIImage istanza (utilizzando objc_getAssociatedObject) in qualsiasi momento si desidera.

    Posso verificare il funzionamento, con l’avvertenza che non è possibile ottenere i nomi di UIImage caricato in Punte. Sembra che le immagini caricate da Punte non vengono creati attraverso qualsiasi standard di chiamate di funzione, quindi è davvero un mistero per me.

    Sto lasciando l’implementazione a voi. Copia-incolla il codice che le viti con l’Obiettivo di runtime C è una buona idea, quindi scegli con attenzione il tuo progetto di esigenze e di implementare questo solo se è necessario.

    • Perché non creare una sottoclasse di UIImage l’override di un metodo?
    • vrwim: è necessario swizzle quando vuoi aggiungere qualcosa ad un esistente comportamento. se si utilizza categoria (o successione), si sarà in grado di passare un po ‘ di codice in un altro, ma non sarà in grado di farlo senza perdere l’originale comportamento. in altre parole, se si tenta di scrivere (in classe ereditata): +imageNamed:(NSString*)imageName { // save file name in new property or whatever [self imageNamed:imageName]; // infinite loop [super imageNamed:imageName]; // super doesn't contain such a method }
    • ciao ben, per qualsiasi motivo, non basta usare setAccessibilityIdentifier come suggerito da nizar ahmed?
  4. 10

    Non c’è modo nativo per fare questo, tuttavia, si può facilmente creare questo comportamento di te.

    È possibile sottoclasse UIImageView e aggiungere una nuova variabile di istanza:

    NSString* imageFileName;

    Quindi è possibile eseguire l’override setImage, prima impostazione imageFileName per il nome del file dell’immagine che si sta impostando, e quindi la chiamata [super setImage:imageFileName]. Qualcosa di simile a questo:

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

    Solo perché non può essere fatto in modo nativo non significa che non è possibile 🙂

    • Grazie per lo spostamento di questo e di aiutare a mantenere il sito pulito!
  5. 10
    if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]])
    {
    
    }
    • In se la condizione e ‘ che ho solo controllando il nome delle immagini
    • Solo codice risposte non sono così utili. Si prega di aggiungere un breve testo che spieghi che cosa il vostro frammento di codice fa.
    • se la condizione è immagine corrispondente nome in imageForCheckMark e [UIImage imageNamed:@”crossCheckMark.png”]], se veri, quindi eseguire qualche riga di codice altrimenti diversi riga di codice
    • Grazie tizio, molto buona.
    • Questo è come ci dice se l’immagine se hot dog o not hotdog.
    • Sto creando alcuni unittests per verificare se le immagini sono impostati, per me questo è utile.

  6. 9

    No. Nessun modo per farlo in modo nativo.
    Si sta andando ad avere per creare una sottoclasse UIImageView, e aggiungere un imageFileName proprietà (che si imposta quando si imposta l’immagine).

    • ciao kenny, per qualsiasi motivo, non basta usare setAccessibilityIdentifier come suggerito da nizar ahmed?
  7. 7

    Né UIImageView non UIImage tiene su il nome del file dell’immagine caricata.

    È possibile

    1: (come suggerito da Kenny Winker sopra) sottoclasse UIImageView per avere un nome di file di proprietà o

    2: nome del file di immagine con i numeri (image1.jpg, image2.jpg ecc) e tag quelle immagini con il numero corrispondente (tag=1 per image1.jpg tag=2 per image2.jpg ecc) o

    3: Sono una classe di livello variabile (es. NSString *currentFileName) che gli aggiornamenti ogni volta che si aggiorna la UIImageView immagine

  8. 3

    Questo codice vi aiuterà:-

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

    Utilizzare questo come:-

    NSString *currentImageName = [self getFileName:MyIImageView];
    • restituisce null !…
    • sì, il suo ritorno null …
    • Sì Return (null)
    • Restituirà null perché non hai impostato il accessibilityIdentifier di sicurezza. Impostare come questo [image setAccessibilityIdentifier:@"demoFileName.png"] ; e quindi chiamare questo metodo
    • Console dice: errore: la proprietà ‘accessibilityIdentifier’ non trovata su un oggetto di tipo ‘UIImage *’ – Xcode 8.1
    • Restituisce il valore Null non provare questo
    • comunque restituisce null

  9. 2

    Sì, è possibile confrontare con l’aiuto di dati, come di seguito codice

    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;
    }
  10. 2

    È possibile utilizzare objective c Runtime caratteristica di associare il nome dell’immagine con il UImageView.

    Prima importazione #import <objc/runtime.h> in classe

    quindi implementare il codice come di seguito :

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

    Spero che ti aiuta.

  11. 2

    Oppure è possibile utilizzare il restauro identificatore, come questo:

    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"

    In sostanza, in questa soluzione si utilizza il restauro identificatore di tenere il nome dell’immagine, quindi è possibile utilizzarlo in un secondo momento ovunque. Se si aggiorna l’immagine, è necessario aggiornare anche il restauro identificatore, come questo:

    myImageView.restorationIdentifier = "newImageName"

    Spero che ti aiuta, buona fortuna!

  12. 1

    Swift 3

    Primo set la accessibilityIdentifier come imageName

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

    Quindi Utilizzare il codice riportato di seguito.

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

    Infine, La chiamata, in modo del metodo per identificare

    myImageView.getFileName()
  13. 1

    Ottenere il nome dell’immagine Swift 4.2

    C’è un modo, se si desidera confrontare l’immagine del pulsante nomi che sono state in attività.

    @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. 0

    Ho a che fare con questo problema, ho risolto da design pattern MVC, ho creato la classe di Scheda:

    @interface Card : NSObject
    
    @property (strong,nonatomic) UIImage* img;
    
    @property  (strong,nonatomic) NSString* url;
    
    @end

    //quindi in UIViewController in DidLoad Metodo per Farlo :

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

    //per Esempio

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

    //maggio si desidera controllare il nome dell’immagine , in modo che si può fare questo:

    //per esempio

     NSString * str = @"image.jpg";
    
     if([str isEqualToString: [card10 url]]){
     //your code here
     }
  15. -1

    utilizzare sotto

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

    Il codice è un lavoro in swift3 – scrivere il codice all’interno didFinishPickingMediaWithInfo delegato metodo:

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

Lascia un commento