2012-04-04 5 views
7

具体的には、画像パスを見つけようとしています。これは得ることができる非常に有用なものであり、私が見つけた限り誰も方法が分からない。生成されたキーのnibファイルを見たところ、そこにある画像URL(test.jpg)を見ることができますが、キーを見つけることができません。キー "UIImage"は、実際に構築された画像(initWithCGImageStored:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientationで構築され、奇妙なUIKit関数呼び出しGetImageAtPathによって呼び出されたinit呼び出しを返します)を返します。initWithCoderで:NSCoder(UINibDecoder)のキーは何ですか? (UIImageViewの場合)

私はまた、NSKeyedArchiverでディスクにUIImageViewを書き込もうとしましたが、これらの値のどれも正しいと思われず、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 

これが役に立ちます。

関連する問題