UIImageView - Atanan görüntünün dosya adı nasıl alınır?


82

UIImageView's UIImage Şu anda içinde saklanan birinin adını okumak mümkün mü UIImageView?

Böyle bir şey yapabileceğini umuyordum ama henüz çözemedim.

NSString *currentImageName = [MyIImageView getFileName];

Yanıtlar:


88

Hayır! Bunu yapamazsınız.

Bunun nedeni, bir UIImageViewörneğin bir görüntü dosyasını saklamamasıdır. Bir UIImageörneği saklar . Bir dosyadan bir görüntü oluşturduğunuzda, şöyle bir şey yaparsınız:

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

Bu yapıldıktan sonra artık dosya adına herhangi bir referans yoktur. UIImageÖrneğin olursa olsun got it nerede, veri içerir. Bu nedenle, UIImageViewdosya adını muhtemelen bilemezler.

Ayrıca, yapabilseniz bile, bir görünümden asla dosya adı bilgisi alamazsınız. Bu MVC'yi bozar.


62
MVC'yi bozması, yapmamanız gerektiği anlamına gelmez. Sonuçta kuralların
çiğnenmesi gerekiyor

10
Bazı kurallar vardır. Ancak iPhone ve Mac'te, MVC'ye bağlı kalmak için her zaman elinizden gelenin en iyisini yapmalısınız. Düşünceli ortamlardır.
Jonathan Sterling

Aslında bunu yapmak mümkün, ancak imageNamed'i düzenlemek için Objective-C çalışma zamanı ile vidalamak gerekiyor: (evet, birçok kuralı çiğniyor .) Bunu projenizde gerçekten önemli bir nedenle yapmanız gerekiyorsa, aşağıdaki cevabıma bakın.
Ben Gotow



109

herhangi bir UIView alt sınıfı için setAccessibilityIdentifier yöntemini kullanabilirsiniz

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

NSString *file_name = [image accessibilityIdentifier] ;

1
burada basitçe karşılaştım, b / c resimleri yerelleştiren bir uygulama oluşturuyorum .. ve localizebasitçe resimlerin üzerinden geçen ve resim adı üzerinde bazı normal ifadeler yapan bir yöntem oluşturmak istiyorum (bunları yapmak için çok iyi nedenlerim var özel yapılmış bir UIImage oluşturmak yerine görüntüler gerçek görüntüler) .. objektif-c'de görüntüleri yerelleştirmenin daha temiz bir yolu olup olmadığını merak ediyordum çünkü herkes MVC hakkında konuşuyor ve ne değil
abbood

1
MVC ile ilgili bir sorun olmadığını biliyorum, ancak test amacıyla buna ihtiyacım vardı.
Radek Wilczak

OSX kullanımı içinaccessibilityDescription
Anoop Vaidya

bu çözümün teknik bir sakıncası var mı? bu en basit, en temiz çözüm gibi görünüyor, öyleyse neden kabul edilen yanıt olarak görülmüyor?
Crashalot

19

Hayır hayır hayır… genel olarak bu şeyler mümkündür. Kendini kirli biri gibi hissettirecek. Kesinlikle mecbursanız, şunu yapın:

  • +imageNamed:(NSString*)imageNameMevcut uygulamaya giden çağrıların kendi uygulamanızla bir kategori oluşturun ve burada tanımlanan tekniği ( objc_setAssociatedObject / objc_getAssociatedObject öğesini bir nesnenin içinde nasıl kullanabilirim? ) imageNameDöndürülen UIImage nesnesiyle kalıcı olarak ilişkilendirmek için kullanın .

  • Objective-C çalışma zamanının yöntem arama tablosunda, uygulamanız için sağlanan uygulamayı değiştirmek üzere Method Swizzling'i kullanın imageNamed:.

  • UIImage örneğiyle ilişkilendirdiğiniz ada (objc_getAssociatedObject kullanarak) istediğiniz zaman erişin.

NIB'lere yüklenen UIImage adlarını alamadığınız uyarısıyla bunun çalıştığını doğrulayabilirim. Görünüşe göre NIB'lerden yüklenen görüntüler herhangi bir standart işlev çağrısı yoluyla oluşturulmuyor, bu yüzden bu benim için gerçekten bir muamma.

Uygulamayı size bırakıyorum. Objective-C çalışma zamanıyla vidalanan kodu kopyalayıp yapıştırmak çok kötü bir fikirdir, bu nedenle projenizin ihtiyaçları hakkında dikkatlice düşünün ve bunu yalnızca gerekiyorsa uygulayın.


1
Neden UIImagebir yöntemi geçersiz kılmak için bir alt sınıf oluşturmuyorsunuz ?
vrwim

vrwim: Var olan bir davranışa bir şey eklemek istediğinizde hareket etmeniz gerekir. Eğer kategori (veya kalıtım) kullanacaksanız, bazı kodları başka bir kodda değiştirebileceksiniz, ancak orijinal davranışı kaybetmeden bunu yapamayacaksınız. başka bir deyişle, (kalıtsal sınıfta) yazmaya çalışırsanız: +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 }
yonivav

merhaba nizar ahmed tarafından önerildiği gibi sadece setAccessibilityIdentifier'ı kullanmamak için herhangi bir sebep yok mu?
Crashalot

10

Bunu yapmanın yerel bir yolu yoktur; ancak, bu davranışı kendiniz kolayca oluşturabilirsiniz.

Alt sınıfa ayırabilir UIImageViewve yeni bir örnek değişkeni ekleyebilirsiniz:

NSString* imageFileName;

Sonra geçersiz kılabilirsiniz setImage, önce ayarladığınız imageFileNamegörüntünün dosya adını ayarlayabilir ve ardından çağırabilirsiniz [super setImage:imageFileName]. Bunun gibi bir şey:

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

Doğal olarak yapılamaması, mümkün olmadığı anlamına gelmez :)


Bunu taşıdığınız ve siteyi temiz tutmaya yardımcı olduğunuz için teşekkürler!
jscs

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

}

Durumda sadece görüntülerin adını kontrol
ettim

2
Yalnızca kod yanıtları o kadar kullanışlı değil. Lütfen kod parçanızın ne yaptığını açıklayan kısa bir metin ekleyin.
nalply

koşul, imageForCheckMark ve [UIImage imageNamed: @ "crossCheckMark.png"]] içindeki resim adıyla eşleşiyorsa, aksi takdirde farklı bir kod satırı
iEinstein

Bu görüntü eğer olsun bize söylemeden gibidir hot dogya not hotdog.
ScottyBlades

Doğru görüntülerin ayarlanıp ayarlanmadığını kontrol etmek için bazı birim testleri oluşturuyorum, bu benim için yararlı.
MQoder

9

Hayır! Bunu yerel olarak yapmanın yolu yok. UIImageView alt sınıfına girmeniz ve bir imageFileName özelliği eklemeniz gerekir (bu özelliği, görüntüyü ayarladığınızda belirleyeceksiniz).


merhaba kenny nizar ahmed tarafından önerildiği gibi setAccessibilityIdentifier'ı kullanmak için herhangi bir nedeniniz var mı?
Crashalot

7

UIImageView, UIImage yüklenen görüntünün dosya adını tutmaz.

Sen de yapabilirsin

1: (yukarıda Kenny Winker tarafından önerildiği gibi) UIImageView alt sınıfının bir fileName özelliğine sahip olması veya

2: resim dosyalarını sayılarla adlandırın (resim1.jpg, resim2.jpg vb.) Ve bu resimleri karşılık gelen numarayla etiketleyin (resim1.jpg için etiket = 1, resim2.jpg vb. İçin etiket = 2) veya

3: UIImageView görüntüsünü her güncellediğinizde güncellenen sınıf düzeyinde bir değişkene (örn. NSString * currentFileName) sahip olun


3

Bu kod size şu konularda yardımcı olacaktır: -

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

Bunu şu şekilde kullanın: -

NSString *currentImageName = [self getFileName:MyIImageView];

Henüz accessibilityIdentifier'ı ayarlamadığınız için null döndürür. Bunu şöyle ayarlayın [image setAccessibilityIdentifier:@"demoFileName.png"] ;ve sonra bu yöntemi çağırın
NSNoob

Konsol diyor ki: hata: 'accessibilityIdentifier' özelliği 'UIImage *' türündeki nesnede bulunamadı - Xcode 8.1
Jamal Zafar

Null döndürür, bunu denemeyin
Kingsley Mitchell

her neyse boş döndürüyor
Saranjith

3

Veya geri yükleme tanımlayıcısını şu şekilde kullanabilirsiniz:

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"

Temel olarak bu çözümde, görüntünün adını tutmak için geri yükleme tanımlayıcısını kullanıyorsunuz, böylece daha sonra her yerde kullanabilirsiniz. Görüntüyü güncellerseniz, aşağıdaki gibi geri yükleme tanımlayıcısını da güncellemeniz gerekir:

myImageView.restorationIdentifier = "newImageName"

Umarım bu size yardımcı olur, iyi şanslar!


2

Evet, aşağıdaki kod gibi veriler yardımıyla karşılaştırabilirsiniz

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

Görüntü adını UImageView ile ilişkilendirmek için objektif c Çalışma Zamanı özelliğini kullanabilirsiniz.

İlk ithalat #import <objc/runtime.h>Sınıfınızda

ardından kodunuzu aşağıdaki gibi uygulayın:

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

Umarım size yardımcı olur.


2

Swift 4.2 adını al

Varlıklarda bulunan düğme resim adlarını karşılaştırmak istemenin bir yolu var.

@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

Hızlı 3

Önce accessibilityIdentifier'ı imageName olarak ayarlayın

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

Ardından aşağıdaki kodu kullanın.

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

Son olarak, tanımlamak için yöntemin çağırma yolu

myImageView.getFileName()

0

Bu sorunu hallettim, MVC tasarım kalıbı ile çözdüm, Card sınıfını oluşturdum:

@interface Card : NSObject

@property (strong,nonatomic) UIImage* img;

@property  (strong,nonatomic) NSString* url;

@end

// daha sonra UIViewControlleriçinde DidLoadDo Yöntem:

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

// Örneğin

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

// resmin adını kontrol etmek isteyebilirsin, böylece bunu yapabilirsin:

//Örneğin

 NSString * str = @"image.jpg";

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

-1

aşağıda kullan

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

-1

Kod swift3'te çalışıyor - didFinishPickingMediaWithInfo temsilci yönteminin içine kod yazın:

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)
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.