在initWithCoder中:NSCoder(UINibDecoder)中的键是什么? (对于UIImageView)

时间:2012-04-04 17:58:31

标签: ios uikit interface-builder nscoder black-box

具体来说,我正在尝试找到图像路径。这将是一个非常有用的东西能够得到,并且据我发现没有人知道如何。我已经查看了生成的nib文件中的密钥,我可以在那里看到图像URL(test.jpg),但找不到获取它的密钥。键“UIImage”返回实际已经构建的图像(通过initWithCGImageStored:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation构建,以及一个神秘的UIKit函数调用GetImageAtPath,它调用上面提到的init调用),所以这没有帮助。

我也尝试使用NSKeyedArchiver将UIImageView写入磁盘,这些值似乎都不正确,test.jpg值也不存在。

如果没人能解决这个问题 - 任何人都知道如何在二进制文件中读取文本?我可以通过nib读取并解析URL,这比没有什么好,但无论我尝试什么格式,NSString的构造函数都会失败。

1 个答案:

答案 0 :(得分:5)

您是否尝试在NSKeyedUnarchiver上实现一个类别并以这种方式捕获密钥?快速实施和调查,您会发现密钥是“UIResourceName”。但请记住,keyed unarchiver仅返回当前解码范围内的key对象。这意味着您无法从根查询此密钥,您必须深入挖掘对象层次结构。

以下是记录所有链接资源的代码。这取决于你如何使用它。它还会在解码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

希望这有帮助。