我在 Cocoa Bindings 中一直遇到的一件事是错误呈现,例如,当用户在附加了格式化程序的文本字段中键入错误值时。通常我会覆盖willPresentError:
响应程序链中的某个位置,但我的问题是 Bindings 系统创建的 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 对象。
我觉得我必须遗漏一些东西才能与错误处理产生这种脱节。有什么建议么?