在initWithCoder中:NSCoder(UINibCoder)中的密钥是什么?(用于UIImageView)



具体来说,我正在尝试查找图像路径。这将是一件非常有用的东西,而且据我所知,没有人知道怎么做。我已经查看了生成的nib文件中的密钥,我可以在其中看到图像URL(test.jpg),但找不到获取密钥的密钥。密钥"UIImage"返回实际已经构建的图像(通过initWithCGImageStored:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation和一个神秘的UIKit函数调用GetImageAtPath构建,该函数调用上述init调用),所以这没有帮助。

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

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

您是否尝试过在NSKeyedUnarchiver上实现一个类别并以这种方式捕获密钥?快速实施和调查,你会发现关键是"UIResourceName"。但是,请记住,键控的非键控器只返回当前解码范围内键的对象。这意味着您无法从根目录查询此键,并且必须深入对象层次结构。

以下是记录任何链接资源的代码。如何使用它取决于您。它还记录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

希望这能有所帮助。

相关内容

最新更新