web-dev-qa-db-ja.com

UIImageView-割り当てられた画像のファイル名を取得する方法は?

現在UIImageに格納されているUIImageView'sUIImageViewの名前を読み取ることはできますか?

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

NSString *currentImageName = [MyIImageView getFileName];
76
Kuberchaun

いや。それはできません。

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

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

これが完了すると、ファイル名への参照はなくなります。 UIImageインスタンスには、データの取得場所に関係なくデータが含まれます。したがって、UIImageViewはおそらくファイル名を知ることができませんでした。

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

84

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

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

NSString *file_name = [image accessibilityIdentifier] ;
101
Nizar Ahmed

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

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

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

18
Ben Gotow

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

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

NSString* imageFileName;

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

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

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

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

}
10
iEinstein

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

9
Kenny Winker

読み込まれた画像のファイル名は、UIImageではなくUIImageViewでも保持されません。

あなたはどちらか

1:(上記のKenny Winkerが示唆したように)UIImageViewをサブクラス化してfileNameプロパティを設定するか、

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

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

7
Mihir Mathuria

このコードはあなたを助けます:-

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

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

NSString *currentImageName = [self getFileName:MyIImageView];
3
junaidsidhu

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

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
Hardik Mamtora

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

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
ThiagoAM

Objectname Cランタイム機能を使用して、imagenameをUImageViewに関連付けることができます。

最初に#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
Nishant Tyagi

スイフト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()
1
Abdul Hameed

イメージ名の取得Swift 4.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
Doca

私はこの問題に対処し、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
 }
0
Hasan Sawaed