8

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

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

如果没有人能弄清楚 - 任何人都知道如何将二进制文件作为文本读取?我可以通读笔尖并解析出 URL,这总比没有好,但是无论我尝试什么格式,NSString 的构造函数都会失败。

4

1 回答 1

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

希望这可以帮助。

于 2013-10-28T10:04:28.083 回答