2012-04-04 9 views
7

특히 이미지 경로를 찾으려고합니다. 이것은 얻을 수있는 매우 유용한 것이고, 내가 아는 한 아무도 그 방법을 알지 못합니다. 생성 된 nib 파일에서 키를 찾았습니다. 이미지 URL (test.jpg)을 볼 수는 있지만 키를 찾을 수 없습니다. "UIImage"키는 실제로 구성된 이미지 (initWithCGImageStored:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation을 통해 생성되고 위에 언급 된 init 호출을 호출하는 신비한 UIKit 함수 호출 GetImageAtPath)를 반환하므로 유용하지 않습니다.initWithCoder에서 : NSCoder (UINibDecoder)의 키는 무엇입니까? (for UIImageView)

또한 UIImageView를 NSKeyedArchiver로 디스크에 쓰려고 시도했지만이 값 중 어느 것도 올바른 것으로 보이지 않으며 test.jpg 값도 존재하지 않습니다.

아무도 이것을 파악할 수없는 경우 - 바이너리 파일을 텍스트로 읽는 방법을 아는 사람이 있습니까? 난 그냥 펜촉을 통해 읽을 수있는 아무것도보다 나은 URL을 구문 분석하지만 NSString의 생성자에 관계없이 어떤 형식을 시도합니다.

답변

5

NSKeyedUnarchiver에 카테고리를 구현하고 키를 캐치하려고 시도 했습니까? 빠른 구현 및 조사를 통해 키가 "UIResourceName"임을 알 수 있습니다. 그러나 키가있는 unarchiver는 현재 디코딩 범위 내에서 키에 대한 객체 만 반환한다는 점을 기억하십시오. 즉, 루트에서이 키를 질의 할 수 없으므로 오브젝트 계층을 깊이 파고 들어야합니다.

아래 링크 된 리소스를 기록하는 코드입니다. 어떻게 사용 하느냐는 당신에게 달려 있습니다. 또한 UIImage가 디코딩 될 때 기록됩니다. 원하는 경우 여기에 자신의 수업을 되돌릴 수 있습니다.

@interface NSKeyedUnarchiver (MyKeyedUnarchiver) 
@end 

@implementation NSKeyedUnarchiver (MyKeyedUnarchiver) 

- (id) mydecodeObjectForKey:(NSString *)key 
{ 
    id obj = [self mydecodeObjectForKey:key]; 
    if ([key isEqualToString:@"UIResourceName"]) 
     NSLog(@"The linked resource name is: %@", obj); 
    return obj; 
} 

- (Class) myclassForClassName:(NSString *)codedName 
{ 
    if ([codedName isEqualToString:@"UIImageNibPlaceholder"]) 
     NSLog(@"Decoding a UIImage"); 
    return [self myclassForClassName:codedName]; 
} 

+ (void) load 
{ 
    SEL origM = @selector(decodeObjectForKey:); 
    SEL newM = @selector(mydecodeObjectForKey:); 
    method_exchangeImplementations(class_getInstanceMethod(self, origM), class_getInstanceMethod(self, newM)); 

    origM = @selector(classForClassName:); 
    newM = @selector(myclassForClassName:); 
    method_exchangeImplementations(class_getInstanceMethod(self, origM), class_getInstanceMethod(self, newM)); 
} 

@end 

희망이 있습니다.