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
的常规属性,例如hasclearButtonMode
那么,为什么不能使用键值编码访问
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;