UIImageView-할당 된 이미지의 파일 이름을 얻는 방법은 무엇입니까?


82

의 이름을 읽을 수 있습니까? UIImageView's UIImage 현재 저장된의UIImageView 있습니까?

당신이 이런 일을 할 수 있기를 바랐지만 아직 알아 내지 못했습니다.

NSString *currentImageName = [MyIImageView getFileName];

답변:


88

아니. 당신은 그렇게 할 수 없습니다.

그 이유는 UIImageView인스턴스가 이미지 파일을 저장하지 않기 때문입니다 . 디스플레이 UIImage인스턴스를 저장 합니다. 파일에서 이미지를 만들 때 다음과 같이합니다.

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

이 작업이 완료되면 더 이상 파일 이름에 대한 참조가 없습니다. UIImage인스턴스는 관계없이 그것을 가지고 어디에 데이터가 포함되어 있습니다. 따라서 UIImageView파일 이름을 알 수 없습니다.

또한 가능하더라도 뷰에서 파일 이름 정보를 얻을 수 없습니다. 그것은 MVC를 깨뜨립니다.


62
MVC가 망가 졌다고해서 그렇게하지 말아야한다는 의미는 아닙니다. 결국 규칙을 위반해야합니다;)
Sneakyness

10
몇 가지 규칙이 있습니다. 그러나 iPhone 및 Mac에서는 항상 MVC를 준수하기 위해 최선을 다해야합니다. 그들은 독단적 인 환경입니다.
Jonathan Sterling

실제로 이것을 할 수는 있지만 imageNamed를 편집하려면 Objective-C 런타임을 조이는 것이 필요합니다. (예, 많은 규칙을 위반합니다.) 중요한 이유로 프로젝트에서이 작업을 수행해야하는 경우 아래 내 대답을 참조하십시오.
벤 Gotow


스위프트에 : (문자열 이름)이있는 UIImage처럼 보이는
RedEagle2000

109

UIView의 모든 하위 클래스에 setAccessibilityIdentifier 메서드를 사용할 수 있습니다.

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

NSString *file_name = [image accessibilityIdentifier] ;

1
나는 여기에 단순히 b / c 나는 지역화 된 이미지가있는 앱을 만들고있다. 그리고 나는 localize단순히 이미지를 통과하고 이미지 이름에 대한 정규식을 수행 하는 방법 을 만들고 싶다 (그것을 만드는 아주 좋은 이유가있다. 사용자 정의 UIImage를 만드는 대신 실제 이미지 이미지) .. 모두가 MVC에 대해 이야기하고 있기 때문에
object

1
MVC에 문제가 없다는 것을 알고 있지만 테스트 목적으로 필요했습니다.
Radek Wilczak 2014

OSX 용accessibilityDescription
Anoop Vaidya 2015

이 솔루션에 기술적 단점이 있습니까? 이것은 가장 간단하고 깨끗한 해결책처럼 보이지만 왜 받아 들여진 대답으로 간주되지 않습니까?
Crashalot

19

아니오 아니오 아니오… 일반적으로 이러한 일이 가능합니다. 그것은 당신을 더러운 사람처럼 느끼게 할 것입니다. 꼭 필요한 경우 다음을 수행하십시오.

  • +imageNamed:(NSString*)imageName기존 구현에 대한 호출 의 자체 구현으로 범주를 만들고 여기에 식별 된 기술 ( 개체 내에서 objc_setAssociatedObject / objc_getAssociatedObject를 사용하는 방법 )을 imageName사용하여 반환 된 UIImage 개체와 영구적으로 연결 합니다.

  • Objective-C 런타임의 메서드 조회 테이블에서 구현에 대해 제공된 구현을 바꾸려면 메서드 전환을 사용 imageNamed:합니다.

  • 원할 때마다 UIImage 인스턴스 (objc_getAssociatedObject 사용)와 연결 한 이름에 액세스합니다.

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 }
쓰려고하면

안녕 벤 nizar ahmed가 제안한대로 setAccessibilityIdentifier를 사용하지 않는 이유가 있습니까?
Crashalot

10

이를 수행하는 고유 한 방법은 없습니다. 그러나이 동작을 직접 쉽게 만들 수 있습니다.

하위 클래스 UIImageView를 만들고 새 인스턴스 변수를 추가 할 수 있습니다 .

NSString* imageFileName;

그런 다음을 재정의 setImage하고 먼저 설정 imageFileName중인 이미지의 파일 이름을 설정 한 다음 [super setImage:imageFileName]. 이 같은:

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

기본적으로 할 수 없다고해서 불가능하다는 의미는 아닙니다. :)


이것을 옮기고 사이트를 깨끗하게 유지하는 데 도움을 주셔서 감사합니다!
jscs

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

}

if 조건에서 방금 이미지 이름을 확인했습니다
iEinstein

2
코드 전용 답변은 그다지 유용하지 않습니다. 코드 조각의 기능을 설명하는 짧은 텍스트를 추가하세요.
nalply

조건이 imageForCheckMark의 이미지 이름과 일치하는 경우 [UIImage imageNamed : @ "crossCheckMark.png"]] 참이면 일부 코드 줄을 실행하고 그렇지 않으면 다른 코드 줄을 실행합니다
iEinstein

이것은 이미지가 hot dog또는 not hotdog.
ScottyBlades

올바른 이미지가 설정되었는지 확인하기 위해 몇 가지 단위 테스트를 만들고 있는데, 이것은 유용합니다.
MQoder 19

9

아니. 기본적으로 할 방법이 없습니다. UIImageView를 하위 클래스로 만들고 imageFileName 속성 (이미지를 설정할 때 설정)을 추가해야합니다.


안녕하세요 kenny nizar ahmed가 제안한 것처럼 setAccessibilityIdentifier를 사용하지 않는 이유가 있습니까?
Crashalot

7

UIImage가 아닌 UIImageView는로드 된 이미지의 파일 이름을 보유하지 않습니다.

당신은

1 : (위의 Kenny Winker가 제안한대로) 하위 클래스 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

콘솔 메시지 : 오류 : 'UIImage *'유형의 개체에서 'accessibilityIdentifier'속성을 찾을 수 없음-Xcode 8.1
Jamal Zafar

널 반환이 시도하지 않는
킹슬리 미첼

어쨌든 그것은 null을 반환
Saranjith

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

이미지 이름을 UImageView와 연결하기 위해 객관적인 c 런타임 기능을 사용할 수 있습니다.

#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

이미지 이름 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

스위프트 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.