2011-07-07 13 views
10

Działanie tego:Dlaczego valueForKey: na UITextField zgłasza wyjątek dla właściwości UITextInputTraits?

@try 
{ 
    NSLog(@"1. autocapitalizationType = %d", [self.textField autocapitalizationType]); 
    NSLog(@"2. autocapitalizationType = %@", [self.textField valueForKey:@"autocapitalizationType"]); 
} 
@catch (NSException *exception) 
{ 
    NSLog(@"3. %@", exception); 
} 

Wyjścia to:

1. autocapitalizationType = 0 
3. [<UITextField 0x6c15df0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key autocapitalizationType. 

Spodziewałem:

1. autocapitalizationType = 0 
2. autocapitalizationType = 0 

Wyjątek występuje tylko o właściwościach, które są częścią protokołu UITextInputTraits. Zwykłe takie właściwości mają clearButtonMode mogą być dostępne przez valueForKey:.

Dlaczego więc nie można uzyskać dostępu do właściwości UITextInputTraits za pomocą kodowania klucz-wartość?

+0

Prawdopodobne ze względu na szczegóły implementacji. Powinieneś zgłosić [zgłoszenie błędu] (http://bugreport.apple.com) firmie Apple. –

Odpowiedz

4

Jeśli zagłębić się w ramach UIKit i otworzyć UITextField.h znajdziesz:

@interface UITextField : UIControl <UITextInput, NSCoding> { 
    @private 

    UITextInputTraits *_traits; 
    UITextInputTraits *_nonAtomTraits; 

Znajdziesz tu także, że clearButtonMode jest zadeklarowana jako @property w pliku nagłówkowym UITextField, ale autocapitalizationType (i reszta protokołu UITextInputTraits) nie są.

Ty i ja nie dostać się do zobaczyć UITextField.m, więc wszystkie naprawdę możemy stwierdzić, że Apple jest realizowany UITextInputTraits protokół UITextField jest w taki sposób, że nie jest to zgodne z KVC. Przypuszczalnie kod kleju gdzieś konwertuje [myTextField autocapitalizationType] na odpowiednią wartość, ale cokolwiek zakulisowa magia ma miejsce, zatrzymuje się przed valueForKey:.

2

Oto moje obejście: dla każdej klasy implementującej metodę wykonałem swisszled valueForKey:. Jeśli klucz jest kluczem UITextInputTraits , należy wywołać valueForKey: na obiekcie obiektu textInputTraits zamiast samego obiektu. Poniższe szczegóły implementacji: 1, 2 i 3.

Powiązane problemy