运行此:
@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
属性?
答案 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)