UIImageView-jak uzyskać nazwę pliku obraz przypisany?

Czy można odczytać nazwę UIImageView's UIImage to jest obecnie przechowywane w UIImageView?

Miałem nadzieję, że możesz zrobić coś takiego, ale jeszcze tego nie rozgryzłem.
NSString *currentImageName = [MyIImageView getFileName];
Author: Alex Cio, 2009-11-16

15 answers

Nie. Nie możesz tego zrobić.

Powodem jest to, że instancja UIImageView nie przechowuje pliku obrazu. Przechowuje a wyświetla instancję UIImage. Kiedy tworzysz obraz z pliku, robisz coś takiego:

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

Gdy to zrobisz, nie ma już żadnego odniesienia do nazwy pliku. Instancja UIImage zawiera dane, niezależnie od tego, skąd je ma. Tak więc UIImageView nie może znać nazwy pliku.

Ponadto, nawet gdybyś mógł, nigdy nie uzyskałbyś informacji o nazwie pliku z widok. To łamie MVC.

 81
Author: Jonathan Sterling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-16 05:39:51

Możesz użyć metody setAccessibilityIdentifier dla dowolnej podklasy UIView

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

NSString *file_name = [image accessibilityIdentifier] ;
 94
Author: Nizar Ahmed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-04 11:32:54

Nie Nie Nie... ogólnie takie rzeczy są możliwe. To sprawi, że poczujesz się jak brudna osoba. Jeśli koniecznie musisz, zrób to: {]}

  • Utwórz kategorię z własną implementacją +imageNamed:(NSString*)imageName, która wywoła do istniejącej implementacji i wykorzystuje technikę określoną tutaj ( Jak użyć objc_setassocjatedobject / objc_getassocjatedobject wewnątrz obiektu?) aby trwale powiązać imageName z zwracanym obiektem UIImage.

  • Użycie metoda Swizzling do zamiany dostarczonej implementacji imageNamed: dla Twojej implementacji w tabeli wyszukiwania metod runtime Objective-C.

  • Uzyskaj dostęp do nazwy powiązanej z instancją UIImage (używając objc_getassocjatedobject) w dowolnym momencie.

Mogę sprawdzić, czy to działa, z zastrzeżeniem, że nie możesz załadować nazw UIImage w Stalówkach. Wygląda na to, że obrazy załadowane ze stalówek nie są tworzone za pomocą żadnej standardowej funkcji rozmowy, więc to dla mnie zagadka.

Zostawiam realizację Tobie. Kopiowanie i wklejanie kodu, który wkręca się w środowisko uruchomieniowe Objective-C, jest bardzo złym pomysłem, więc dokładnie zastanów się nad potrzebami projektu i zaimplementuj to tylko wtedy, gdy musisz.
 15
Author: Ben Gotow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:33

Nie ma natywnego sposobu, aby to zrobić; jednak możesz łatwo stworzyć to zachowanie samodzielnie.

Możesz podklasować UIImageView i dodać nową zmienną instancji:

NSString* imageFileName;

Następnie można przesłonić setImage, najpierw ustawić imageFileName na nazwę pliku ustawianego obrazu, a następnie wywołać [super setImage:imageFileName]. Coś takiego:

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

To, że nie da się tego zrobić natywnie, nie znaczy, że nie jest to możliwe:)

 10
Author: WendiKidd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-22 04:27:27

Nie. Nie da się tego zrobić natywnie. Będziesz musiał podklasować UIImageView i dodać właściwość imageFileName (którą ustawiasz podczas ustawiania obrazu).

 9
Author: Kenny Winker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-16 05:37:55
if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]])
{

}
 9
Author: iEinstein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-19 11:37:26

Ani UIImageView, ani UIImage nie przechowują nazwy pliku załadowanego obrazu.

Możesz albo

1: (Jak zasugerował Kenny Winker powyżej) podklasa UIImageView ma właściwość fileName lub

2: nazwij Pliki Obrazów liczbami (image1.jpg, image2.jpg itp.) i oznacz te obrazy odpowiednim numerem (tag=1 dla image1.jpg, tag = 2 dla image2.jpg itp.) lub

3: mieć zmienną poziomu klasy (np. NSString * currentFileName) który aktualizuje się za każdym razem, gdy zaktualizuj Obraz UIImageView

 7
Author: Mihir Mathuria,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-17 22:27:02

Ten kod ci pomoże: -

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

Użyj tego jako: -

NSString *currentImageName = [self getFileName:MyIImageView];
 3
Author: junaidsidhu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-04 07:57:12

Możesz użyć funkcji Runtime objective c, aby powiązać nazwę obrazu z UImageView.

Pierwszy import #import <objc/runtime.h> w twojej klasie

Następnie zaimplementuj swój kod jak poniżej:

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");
Mam nadzieję, że ci to pomoże.
 2
Author: Nishant Tyagi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-04 07:11:37

Tak możesz porównać za pomocą danych jak poniżej

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;
}
 1
Author: Hardik Mamtora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-13 07:01:30

Swift 3

Najpierw ustaw accessibilityIdentifier jako imageName

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

Następnie użyj poniższego kodu.

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

Wreszcie sposób wywołania metody identyfikacji

myImageView.getFileName()
 1
Author: Abdul Hameed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 11:07:15

Lub możesz użyć identyfikatora przywracania, jak to:

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"

Zasadniczo w tym rozwiązaniu używasz identyfikatora przywracania do przechowywania nazwy obrazu, więc możesz go użyć później w dowolnym miejscu. Jeśli zaktualizujesz obraz, musisz również zaktualizować identyfikator przywracania, w następujący sposób:

myImageView.restorationIdentifier = "newImageName"

Mam nadzieję, że to ci pomoże, powodzenia!

 1
Author: ThiagoAM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:03:02

Mam do czynienia z tym problemem, rozwiązałem go wzorcem projektowym MVC, stworzyłem klasę Kart:

@interface Card : NSObject

@property (strong,nonatomic) UIImage* img;

@property  (strong,nonatomic) NSString* url;

@end

/ / Następnie w metodzie UIViewController w metodzie DidLoad wykonać:

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

// na przykład

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

/ / może chcesz sprawdzić nazwę obrazka, więc możesz to zrobić:

//na przykład

 NSString * str = @"image.jpg";

 if([str isEqualToString: [card10 url]]){
 // your code here
 }
 0
Author: Hasan Sawaed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-12 10:26:05

Użyj poniżej

 UIImageView *imageView = ((UIImageView *)(barButtonItem.customView.subviews.lastObject));
 file_name = imageView.accessibilityLabel;
 -1
Author: ramo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-19 17:05:44

Kod działa w swift3-zapis kodu wewnątrz metody delegata didFinishPickingMediaWithInfo:

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)
}
 -1
Author: Niraj Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-27 10:35:58