Cocoa touch 为什么UITextField上的valueForKey:会引发UITEXTS属性的异常?

Cocoa touch 为什么UITextField上的valueForKey:会引发UITEXTS属性的异常?,cocoa-touch,uikit,key-value-coding,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

运行此:

@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.
此异常仅在属于
UITRAITS
协议一部分的属性中发生。可以通过
valueForKey:
访问
UITextField
的常规属性,例如has
clearButtonMode


那么,为什么不能使用键值编码访问
UITextField.h
属性呢?

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

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

    UITextInputTraits  *_traits;
    UITextInputTraits  *_nonAtomTraits;
@接口UITextField:UIControl{
@私人的
有两种特质;
非原子特征;
您还将发现,
clearButtonMode
在UITextField头文件中声明为
@属性
,但是
autocapitalizationType
(以及
uitextraits
协议的其余部分)不是


你和我都看不到
UITextField.m
,所以我们真正能得出的结论是,苹果以一种不符合KVC的方式实现了
UITextField
uitextraits
协议。大概是将代码粘在某个地方转换成
[myTextField autocapitalizationType]
转换为适当的值,但无论幕后发生了什么魔法,都会在
valueForKey:

以下是我的解决方法:我为实现
textInputRaits
方法的每个类切换
valueForKey:
。如果键是uitePuttRaits键,则在对象的
textInputRaits
,而不是对象本身


以下是实施细节:,和。

可能是由于实施细节。您应该向苹果公司提交一份文件。
@interface UITextField : UIControl <UITextInput, NSCoding> {
  @private

    UITextInputTraits  *_traits;
    UITextInputTraits  *_nonAtomTraits;