Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 当涉及绑定时,如何覆盖NSError表示?_Objective C_Cocoa_Core Data_Error Handling_Cocoa Bindings - Fatal编程技术网

Objective c 当涉及绑定时,如何覆盖NSError表示?

Objective c 当涉及绑定时,如何覆盖NSError表示?,objective-c,cocoa,core-data,error-handling,cocoa-bindings,Objective C,Cocoa,Core Data,Error Handling,Cocoa Bindings,我在Cocoa绑定中一直遇到的一个问题是错误表示,例如,当用户在文本字段中键入错误的值并附加格式化程序时。通常我会覆盖响应程序链中的某个位置willPresentError:,但我的问题是绑定系统创建的NSError对象没有包含足够的信息,无法告诉我失败的是什么,或者我是否对自定义错误感兴趣。我可以完全删除等式中的绑定,并在出现验证问题时创建自己的错误,但我觉得这样做会扔掉一些有用的东西 通过实现NSControl委托方法并将失败的控件存储在视图控制器的实例变量中,我已经能够解决这个问题。如果在

我在Cocoa绑定中一直遇到的一个问题是错误表示,例如,当用户在文本字段中键入错误的值并附加格式化程序时。通常我会覆盖响应程序链中的某个位置
willPresentError:
,但我的问题是绑定系统创建的NSError对象没有包含足够的信息,无法告诉我失败的是什么,或者我是否对自定义错误感兴趣。我可以完全删除等式中的绑定,并在出现验证问题时创建自己的错误,但我觉得这样做会扔掉一些有用的东西

通过实现NSControl委托方法并将失败的控件存储在视图控制器的实例变量中,我已经能够解决这个问题。如果在
willPresentError:
滚动时它不是nil,我知道什么东西无法验证

- (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];
}
当第一响应者发生变化时,这种方法就起作用了,但当我在视图控制器上调用
committeediting
时就不起作用了,因此它对我来说只是部分有用

我能看到的唯一其他选择是将NSFormatter从等式中去掉,并在我的核心数据管理对象中使用
validateValue:forKey:error:
来处理验证。这对我来说没有使用格式化程序那么有意义,但至少我可以完全控制NSError对象

我觉得我一定是错过了一些东西,才会出现这种与错误处理的脱节。有什么建议吗

我可以完全删除等式中的绑定,并在出现验证问题时创建自己的错误,但我觉得这样做会扔掉一些有用的东西

您可以使用
NSUnderlyingErrorKey
将一个错误(该键的对象)包装到另一个错误(其
userInfo
包含该键的错误)中

我能看到的唯一其他选择是将NSFormatter从等式中去掉,并在我的核心数据管理对象中使用validateValue:forKey:error:来处理验证。这对我来说没有使用格式化程序那么有意义,但至少我可以完全控制NSError对象

这是两个独立的级别,它们并不相互排斥。格式化程序验证在视图层;键值验证(在本例中,在托管对象中)位于模型层

如果所讨论的验证应该发生在视图层,那么将NSFormatter类划分为子类(如果还没有),并实现
getObjectValue:forString:errorDescription:
,以返回更具体的错误描述。(不过,我不知道绑定是否实际使用了此错误描述。您应该检查一下。)

如果验证应在模型层进行,请在NSManagedObject子类中实现
validate:error:
validateValue:forKey:error:
)的单一属性版本


如果某些约束位于模型层,而其他约束位于视图层,则同时执行这两个操作。如果对你的应用程序和你的检查有意义的话,你可以在格式化程序中执行一些检查和模型中的其他检查。

我是NSFormatter的子类,虽然绑定确实使用了NSString错误消息,但我提供的最终NSAlert仍然是非常简单的(我想至少为错误添加一个恢复建议)。我正在做的验证似乎更适合我的NSFormatter子类,这就是为什么我对在模型上实现键值验证犹豫不决的原因。我最终会做各种与数据模型无关的字符串解析,只是为了在出现问题时定制前端错误消息。