2012-04-04 23 views
7

Cụ thể, tôi đang cố tìm đường dẫn hình ảnh. Đây sẽ là một thứ siêu hữu ích để có thể nhận được, và theo như tôi đã thấy không ai biết làm thế nào. Tôi đã xem xét các tập tin nib được tạo ra cho các phím, và tôi có thể nhìn thấy URL hình ảnh trong đó (test.jpg) nhưng không thể tìm thấy chìa khóa để có được nó. Chìa khóa "UIImage" trả về hình ảnh thực tế đã được xây dựng (được xây dựng thông qua initWithCGImageStored:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation và một hàm UIKit bí ẩn gọi số GetImageAtPath gọi là cuộc gọi init đã đề cập), vì vậy điều đó không hữu ích.Trong initWithCoder: các phím trong NSCoder (một UINibDecoder) là gì? (đối với UIImageView)

Tôi cũng đã thử viết UIImageView vào đĩa bằng NSKeyedArchiver và không có giá trị nào trong số đó có vẻ đúng hoặc giá trị test.jpg cũng không tồn tại ở đó.

Nếu không ai có thể nhận ra điều này - bất kỳ ai biết cách đọc trong tệp nhị phân dưới dạng văn bản? Tôi chỉ có thể đọc thông qua ngòi ngách và phân tích các URL, tốt hơn là không có gì, nhưng các nhà xây dựng của NSString không phân biệt định dạng nào tôi thử.

Trả lời

5

Bạn đã cố gắng triển khai danh mục trên NSKeyedUnarchiver và nắm bắt các khóa theo cách đó? Triển khai và điều tra nhanh chóng và bạn sẽ thấy rằng khóa là "UIResourceName". Tuy nhiên, hãy nhớ rằng trình hủy bỏ khóa đã trả về cho bạn chỉ các đối tượng cho khóa trong phạm vi giải mã hiện tại. Điều này có nghĩa là bạn không thể truy vấn khóa này từ gốc và bạn phải đào sâu vào hệ thống phân cấp đối tượng.

Dưới đây là mã ghi nhật ký bất kỳ tài nguyên được liên kết nào. Đó là vào bạn làm thế nào để bạn sử dụng nó. Nó cũng ghi lại khi một UIImage được giải mã. Bạn có thể trả lại lớp học của riêng bạn ở đây nếu bạn muốn.

@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 

Hy vọng điều này sẽ hữu ích.