2012-04-04 20 views
7

W szczególności próbuję znaleźć ścieżkę obrazu. Byłaby to bardzo przydatna rzecz, którą można uzyskać, i o ile wiem, nikt nie wie jak. Przyjrzałem się wygenerowanemu plikowi nib dla kluczy i jestem w stanie zobaczyć tam URL obrazu (test.jpg), ale nie mogę znaleźć klucza, aby go uzyskać. Klucz "UIImage" zwraca rzeczywisty już skonstruowany obraz (skonstruowany przez initWithCGImageStored:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation i tajemniczy wywołanie funkcji UIKit GetImageAtPath, które wywołuje wspomniane wywołanie init), więc to nie jest pomocne.W initWithCoder: jakie są klucze w NSCoder (UINibDecoder)? (dla UIImageView)

Próbowałem również napisać UIImageView na dysku z NSKeyedArchiver i żadna z tych wartości nie wydaje się poprawna, ani nie ma tam wartość test.jpg istnieje.

Jeśli nikt nie może tego zrozumieć - każdy wie, jak czytać w pliku binarnym jako tekst? Mógłbym po prostu przeczytać końcówkę i przeanalizować URL-e, co jest lepsze niż nic, ale konstruktorzy NSString zawodzą, bez względu na format, który próbuję.

Odpowiedz

5

Czy próbowałeś zaimplementować kategorię na NSKeyedUnarchiver i złapać klawisze w ten sposób? Szybka implementacja i dochodzenie, a przekonasz się, że kluczem jest "UIResourceName". Należy jednak pamiętać, że kluczowany unarchiver zwraca tylko obiekty dla klucza w bieżącym zakresie dekodowania. Oznacza to, że nie możesz wyszukiwać tego klucza z poziomu katalogu głównego i musisz zagłębić się w hierarchii obiektów.

Poniżej znajduje się kod, który rejestruje wszystkie powiązane zasoby. To od Ciebie zależy, jak z niego korzystasz. Loguje się także, gdy kod UIIm jest zdekodowany. Możesz tutaj zwrócić własną klasę, jeśli chcesz.

@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 

Mam nadzieję, że to pomoże.

Powiązane problemy