我在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对象.
我觉得我必须遗漏一些东西,因为这种与错误处理的脱节.有什么建议?