代码之家  ›  专栏  ›  技术社区  ›  Marc Charbonneau

当涉及绑定时,如何重写NSError表示?

  •  7
  • Marc Charbonneau  · 技术社区  · 17 年前

    在Cocoa绑定中,我经常遇到的一个问题是错误表示,例如,当用户在附加了格式化程序的文本字段中键入错误的值时。通常我会超控 willPresentError:

    通过实现NSControl委托方法并将失败的控件存储在视图控制器的一个实例变量中,我已经能够解决这个问题。如果当时不是零 演示者错误: 转过来,我知道什么没能验证。

    - (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: 在我的核心数据管理对象处理验证。这对我来说没有使用格式化程序那么有意义,但至少我可以完全控制NSError对象。

    我觉得我一定是漏掉了一些东西,这样才会与错误处理脱节。有什么建议吗?

    1 回复  |  直到 16 年前
        1
  •  4
  •   Peter Hosey    17 年前

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

    你可以用 NSUnderlyingErrorKey userInfo 包含该键)。

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

    如果有问题的验证应该发生在视图层,那么将NSFormatter类子类化(如果还没有),并实现 getObjectValue:forString:errorDescription:

    validate<Key>:error: (单属性版本 validateValue:forKey:error: )在NSManagedObject子类中。

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