2011-07-07 4 views
10

UITextFieldのvalueForKey:がUITextInputTraitsプロパティの例外をスローするのはなぜですか?これを実行する

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

出力この:

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

私は期待していた:

1. autocapitalizationType = 0 
2. autocapitalizationType = 0 

この例外は唯一UITextInputTraitsプロトコルの一部である特性で発生します。 通常UITextFieldのようなものはclearButtonModeであり、valueForKey:からアクセスできます。

なぜ、キー値コーディングでUITextInputTraitsプロパティにアクセスできませんか? (

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

    UITextInputTraits *_traits; 
    UITextInputTraits *_nonAtomTraits; 

あなたはまたclearButtonModeはUITextFieldのヘッダファイル内@propertyとして宣言されていることがわかりますが、それautocapitalizationType:あなたはUIKitフレームワークを詳細に調べるとUITextField.hを開く場合

+0

実装の詳細が原因である可能性があります。 Appleに[バグレポート](http://bugreport.apple.com)を提出する必要があります。 –

答えて

4

、あなたは見つけることができます残りのUITextInputTraitsプロトコル)はそうではありません。

あなたと私は、私たちは本当に結論付けることができ、すべてがAppleがKVC準拠していない方法でUITextFieldUITextInputTraitsプロトコルを実装することで、UITextField.mを見ることがありません。おそらくコードを貼り付けると[myTextField autocapitalizationType]が適切な値に変換されますが、舞台裏の魔法が行われているものはvalueForKey:の手前で止まります。

2

ここに私の回避策があります:私はtextInputTraitsメソッドを実装するすべてのクラスに対してvalueForKey:を驚いた。キーがUITextInputTraitsキーの場合は、オブジェクト自体ではなくtextInputTraitsオブジェクトのvalueForKey:を呼び出します。

実装の詳細は、1,2および3です。

関連する問題