为什么valueForKey:在UITextField上抛出UITextInputTraits属性的异常?

时间:2011-07-07 21:39:36

标签: cocoa-touch uikit key-value-coding

运行此:

@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属性?

2 个答案:

答案 0 :(得分:4)

如果你深入研究UIKit框架并打开UITextField.h,你会发现:

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

    UITextInputTraits  *_traits;
    UITextInputTraits  *_nonAtomTraits;

您还会在UITextField头文件中发现clearButtonMode被声明为@property,但autocapitalizationType(以及UITextInputTraits协议的其余部分)是不

你和我没有看到UITextField.m,所以我们真正得出的结论是,Apple以一种不符合KVC的方式实施了UITextField的{​​{1}}协议。据推测,某处的胶水代码会将UITextInputTraits转换为适当的值,但无论幕后魔法发生在[myTextField autocapitalizationType]之间,都会停止。

答案 1 :(得分:2)

以下是我的解决方法:我为每个实现valueForKey:方法的类调整了textInputTraits。如果密钥是 UITextInputTraits 密钥,则在对象的valueForKey:上调用textInputTraits而不是对象本身。

以下是实施细则:123