UIImageView-割り当てられた画像のファイル名を取得するにはどうすればよいですか?


82

UIImageView's UIImage 現在に保存されているの名前を読み取ることは可能UIImageViewですか?

私はあなたがこのようなことをすることができることを望んでいましたが、それを理解していませんでした。

NSString *currentImageName = [MyIImageView getFileName];

回答:


88

いいえ。あなたはそれをすることはできません。

その理由は、UIImageViewインスタンスが画像ファイルを保存しないためです。UIImageインスタンスを表示して保存します。ファイルから画像を作成するときは、次のようにします。

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

これが完了すると、ファイル名への参照はなくなります。UIImageインスタンスは関係なく、それはそれを得たところの、データが含まれています。したがって、はUIImageViewファイル名を知ることができなかった可能性があります。

また、可能であっても、ビューからファイル名情報を取得することはありません。それはMVCを壊します。


62
それがMVCを壊すからといって、あなたがそれをすべきではないという意味ではありません。結局のところ、ルールは破られることを意図しています;)
卑劣な2009

10
いくつかのルールがあります。ただし、iPhoneとMacでは、MVCを順守するために常に最善を尽くす必要があります。それらは意見の分かれる環境です。
ジョナサンスターリング

実際にこれを行うことは可能ですが、imageNamedを編集するにはObjective-Cランタイムをねじ込む必要があります:(はい、多くのルールを破っています)。何らかの重要な理由でプロジェクトでこれを行う必要がある場合は、以下の私の答えを参照してください。
ベンゴトウ2012

3
@JonathanSterling MVCにはさまざまな解釈があります
2013年

SwiftのUIImage(名前:String)のように見えます
RedEagle2000 2015

109

UIViewの任意のサブクラスにsetAccessibilityIdentifierメソッドを使用できます

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

NSString *file_name = [image accessibilityIdentifier] ;

1
私はここに出くわしましたb / c私はローカライズされた画像を持つアプリを作成しています..そして私localizeは単に画像を調べて画像名にいくつかのregexを行うメソッドを作成したいと思います(私はそれらを作る非常に正当な理由がありますカスタムメイドのUIImageを作成するのではなく、実際の画像を画像化します。..Objective-c ..で画像をローカライズするためのよりクリーンな方法があるかどうか疑問に思いました。誰もがMVCについて話しているので、そうではありません
2014

1
MVCには問題がないことはわかっていますが、テストの目的で必要でした。
Radek Wilczak 2014年

OSXで使用する場合accessibilityDescription
Anoop Vaidya 2015

このソリューションには技術的な欠点がありますか?これは最も単純でクリーンな解決策のように思われるのに、なぜ受け入れられた答えと見なされないのですか?
Crashalot 2016年

19

いいえいいえいいえ…一般的にこれらのことは可能です。それはあなたを汚い人のように感じさせるでしょう。どうしても必要な場合は、次のようにします。

これが機能することを確認できますが、NIBにロードされたUIImageの名前を取得できないという警告があります。NIBから読み込まれた画像は、標準の関数呼び出しでは作成されていないようです。そのため、私には本当に謎です。

実装はあなたに任せます。Objective-Cランタイムにねじ込まれるコードをコピーして貼り付けるのは非常に悪い考えなので、プロジェクトのニーズを慎重に検討し、必要な場合にのみこれを実装してください。


1
UIImageメソッドをオーバーライドするためにのサブクラスを作成してみませんか?
vrwim 2015年

vrwim:既存の動作に何かを追加する場合は、スウィズルする必要があります。カテゴリ(または継承)を使用する場合、一部のコードを別のコードに切り替えることはできますが、元の動作を失うことなくそれを行うことはできません。言い換えると、(継承されたクラスで)書き込もうとする場合: +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 2015

こんにちは、nizar ahmedが提案したようにsetAccessibilityIdentifierを使用しない理由はありますか?
Crashalot 2016年

10

これを行うネイティブな方法はありません。ただし、この動作は自分で簡単に作成できます。

サブクラス化UIImageViewして、新しいインスタンス変数を追加できます。

NSString* imageFileName;

次に、をオーバーライドしてsetImage、最初に設定imageFileNameしている画像のファイル名に設定してから、を呼び出すことができます[super setImage:imageFileName]。このようなもの:

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

ネイティブに実行できないからといって、それが不可能であるとは限りません:)


これを移動し、サイトをクリーンに保つのを手伝ってくれてありがとう!
jscs 2012年

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

}

条件が整っている場合、画像の名前を確認しているだけです
iEinstein 2013

2
コードのみの回答はあまり役に立ちません。コードフラグメントの機能を説明する短いテキストを追加してください。
nalply 2013

条件がimageForCheckMarkの画像名と一致している場合および[UIImageimageNamed:@ "crossCheckMark.png"]] trueの場合、コードの行を実行します。それ以外の場合は別のコード行を実行します
iEinstein 2013

これは、画像がifhot dognot hotdog。かを教えてくれるようなものです。
ScottyBlades

適切な画像が設定されているかどうかを確認するために、いくつかのユニットテストを作成しています。これは便利です。
MQoder

9

いいえ。それをネイティブに行う方法はありません。UIImageViewをサブクラス化し、imageFileNameプロパティ(画像を設定するときに設定する)を追加する必要があります。


こんにちはケニーnizarahmedによって提案されたようにsetAccessibilityIdentifierを使用しない理由はありますか?
Crashalot 2016年

7

UIImageもUIImageも、ロードされた画像のファイル名を保持しません。

あなたはどちらかをすることができます

1 :(上記のKennyWinkerが提案したように)UIImageViewをサブクラス化してfileNameプロパティまたは

2:画像ファイルに番号(image1.jpg、image2.jpgなど)で名前を付け、それらの画像に対応する番号(image1.jpgの場合はtag = 1、image2.jpgの場合はtag = 2など)でタグを付けます。

3:UIImageViewの画像を更新するたびに更新されるクラスレベル変数(NSString * currentFileNameなど)を用意します


3

このコードはあなたを助けるでしょう:-

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

これを次のように使用します:-

NSString *currentImageName = [self getFileName:MyIImageView];

まだaccessibilityIdentifierを設定していないため、nullが返されます。このように設定して[image setAccessibilityIdentifier:@"demoFileName.png"] ;から、このメソッドを呼び出します
NSNoob 2016

コンソールによると:エラー:プロパティ 'accessibilityIdentifier'がタイプ 'UIImage *'のオブジェクトに見つかりません-Xcode8.1
Jamal Zafar

Nullを返します。これは試さないでください
Kingsley Mitchell

とにかくnullを返します
Saranjith 2017年

3

または、次のように復元識別子を使用できます。

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"

基本的に、このソリューションでは、復元識別子を使用してイメージの名前を保持しているため、後でどこでも使用できます。イメージを更新する場合は、次のように復元識別子も更新する必要があります。

myImageView.restorationIdentifier = "newImageName"

それがお役に立てば幸いです。


2

はい、以下のコードのようなデータの助けを借りて比較することができます

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

imagenameをUImageViewに関連付けるために、Objectivecランタイム機能を使用できます。

最初のインポート #import <objc/runtime.h>クラスにする

次に、以下のようにコードを実装します。

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

それがあなたを助けることを願っています。


2

画像名を取得するSwift4.2

アセットにあるボタンの画像名を比較したい場合は、方法があります。

@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

スウィフト3

まず、accessibilityIdentifierをimageNameとして設定します

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

次に、次のコードを使用します。

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

最後に、識別するためのメソッドの呼び出し方法

myImageView.getFileName()

0

私はこの問題に対処し、MVCデザインパターンによって解決し、Cardクラスを作成しました。

@interface Card : NSObject

@property (strong,nonatomic) UIImage* img;

@property  (strong,nonatomic) NSString* url;

@end

//そして、中UIViewControllerDidLoad行うようにする方法:

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

// 例えば

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

//画像名を確認したい場合は、次のようにします。

//例えば

 NSString * str = @"image.jpg";

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

-1

以下を使用してください

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

-1

コードはswift3で動作します-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)
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.