Одна вещь, с которой у меня всегда были проблемы с привязками Какао, - это представление ошибок, например, когда пользователь вводит неправильное значение в текстовое поле с присоединенным форматером. Обычно я бы переопределил willPresentError:
где-нибудь в цепочке респондента, но моя проблема в том, что объекты NSError, созданные системой привязок, не содержат достаточно информации, чтобы я мог сказать, что не удалось, или если это даже ошибка, я заинтересован в настройке , Я мог бы полностью удалить привязки из уравнения и создать свои собственные ошибки, когда возникают проблемы с проверкой, но я чувствую, что я бы выбрасывал некоторые полезные вещи таким образом.
Мне удалось обойти это, реализовав методы делегата NSControl и сохранив элемент управления, который потерпел неудачу, в переменной экземпляра в моем контроллере представления. Если к моменту проката willPresentError:
значение не равно нулю, я знаю, что не удалось проверить.
- (BOOL)control:(NSControl *)control didFailToFormatString:(NSString *)string errorDescription:(NSString *)error;
{
_errorSender = [control retain];
return NO;
}
- (NSError *)willPresentError:(NSError *)error;
{
if ( _errorSender != nil )
{
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:[error userInfo]];
NSString *help = NSLocalizedString( @"Why are you always messing up? You are a terrible person.", @"" );
[_errorSender release];
_errorSender = nil;
[userInfo setObject:help forKey:NSLocalizedRecoverySuggestionErrorKey];
return [NSError errorWithDomain:[error domain] code:[error code] userInfo:userInfo];
}
return [super willPresentError:error];
}
Это работает, когда меняется первый респондент, но не когда я вызываю commitEditing
на контроллере представления, так что это только частично полезно для меня.
Единственный другой вариант, который я вижу, - это исключить NSFormatter из уравнения и использовать validateValue:forKey:error:
в моих управляемых объектах Core Data для обработки проверки. Для меня это не имеет такого большого смысла, как использование средства форматирования, но, по крайней мере, я имею полный контроль над объектом NSError.
Мне кажется, что я что-то упустил, чтобы не было такого рода разъединения с обработкой ошибок. Есть предложения?