Одна вещь, с которой у меня всегда были проблемы в Cocoa Bindings, — это представление ошибок, например, когда пользователь вводит неправильное значение в текстовое поле с прикрепленным средством форматирования. Обычно я бы переопределял willPresentError:
где-то в цепочке респондентов, но моя проблема заключается в том, что объекты NSError, созданные системой Bindings, не содержат достаточно информации, чтобы я мог сказать, что не удалось, или если это даже ошибка, которую я заинтересован в настройке. Я мог бы полностью удалить привязки из уравнения и создать свои собственные ошибки при возникновении проблем с проверкой, но я чувствую, что таким образом выбрасываю некоторые полезные вещи.
Я смог обойти это, реализовав методы делегата 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.
Я чувствую, что должен что-то упустить, чтобы возникло такое отключение при обработке ошибок. Какие-либо предложения?