Я отправляю willChangeValueForKey: и didChangeValueForKey:, но пользовательский интерфейс не обновляется до новых значений, пока текстовое поле все еще активно.
Существует очень мало причин для отправки этих сообщений. Обычно вы можете выполнять ту же работу лучше и чище, внедряя и используя методы доступа (или, что еще лучше, свойства). KVO отправит вам уведомления, когда вы это сделаете.
В вашем случае вы хотите либо отклонить, либо отфильтровать поддельные входы (например, «12abc»). Правильный инструмент для этой задачи - Проверка значения ключа.
Чтобы включить это, установите флажок «Проверять немедленно» на привязке в IB и внедрить метод проверки.
Фильтрация:
- (BOOL) validateMyValue:(inout NSString **)newValue error:(out NSError **)outError {
NSString *salvagedNumericPart;
//Determine whether you can salvage a numeric part from the string; in your example, that would be “12”, chopping off the “abc”.
*newValue = salvagedNumericPart; //@"12"
return (salvagedNumericPart != nil);
}
Отвергая:
- (BOOL) validateMyValue:(inout NSString **)newValue error:(out NSError **)outError {
BOOL isEntirelyNumeric;
//Determine whether the whole string (perhaps after stripping whitespace) is a number. If not, reject it outright.
if (isEntirelyNumeric) {
//The input was @"12", or it was @" 12 " or something and you stripped the whitespace from it, so *newValue is @"12".
return YES;
} else {
if (outError) {
*outError = [NSError errorWithDomain:NSCocoaErrorDomain code: NSKeyValueValidationError userInfo:nil];
}
//Note: No need to set *newValue here.
return NO;
}
}
(Я также заметил, что метод установки получает NSString, а не NSNumber. Это нормально?)
Да, если только вы не используете преобразователь значения, который преобразует строки в числа, подключите средство форматирования чисел к выходу formatter
или замените NSNumber для NSString в вашем методе проверки.