Почему valueForKey: в UITextField выбрасывает исключение для свойств UITextInputTraits? - PullRequest
10 голосов
/ 08 июля 2011

Запуск этого:

@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 ]

4 голосов
/ 08 июля 2011

Если вы углубитесь в структуру UIKit и откроете UITextField.h, вы найдете:

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

    UITextInputTraits  *_traits;
    UITextInputTraits  *_nonAtomTraits;

Вы также обнаружите, что clearButtonMode объявлено как @property в заголовочном файле UITextField, но autocapitalizationType (и остальная часть протокола UITextInputTraits) не являются.

Мы с вами не видим UITextField.m, поэтому все, что мы можем на самом деле сделать вывод, это то, что Apple реализовала протокол UITextField UITextInputTraits способом, не совместимым с KVC. Предположительно, где-то склеенный код преобразует [myTextField autocapitalizationType] в соответствующее значение, но все, что происходит закулисной магией, останавливается до valueForKey:.

2 голосов
/ 18 июля 2011

Вот мой обходной путь: я набрал valueForKey: для каждого класса, реализующего метод textInputTraits. Если ключ является ключом UITextInputTraits , то вызовите valueForKey: для объекта textInputTraits вместо самого объекта.

Вот детали реализации: 1 , 2 и 3 .

...