我的NSViewController
中有一个变量:
dynamic var roll_rate:Double = 0.0
我将其附加到NSTextField
:
模型关键路径显示错误,但它正在工作:当我在字段中更改值时,变量也会更改。但是意味着什么:
Validates Immediately
以及如何显示和检查字段的验证错误。
我尝试了实施方法validateRoll_rate
,但在价值发生变化时没有调用。
答案 0 :(得分:4)
通用解决方案(使用或不使用绑定)处理此问题的一种方法是基于响应here
基本上,您使用controlTextDidChange(notification:)
的{{1}}委托方法,并在其中实现验证代码。
NSTextField
显然 override func controlTextDidChange (notification: NSNotification) {
guard let textField = notification.object as? NSTextField else { return }
// test here, replace the dummy test below with something useful
if textField.stringValue != "expected value" {
myTextFieldOutlet.backgroundColor = NSColor.red
myErrorLabelOutlet.stringValue = "Error !!!"
} else {
// everything OK, reset the background color and error label to the normal state
....
}
}
是与您的文字字段相关联的插座,myTextFieldOutlet
是方便放置的标签的出口,用于显示错误(如果不出现错误,则为空白)
面向绑定的解决方案确保在Interface Builder中选择了myErrorLabelOutlet
,并在进行绑定的类中实现以下方法(在您的示例中为Validates immediately
)
Tuning View Controller
当抛出错误时,将向用户显示宣布错误的标准表格以及取消更改或更正错误的选项。
如果在Interface Builder中选择了override func validateValue(_ ioValue: AutoreleasingUnsafeMutablePointer<AnyObject?>, forKey inKey: String) throws {
// test here, replace the dummy test below with something useful
if roll_rate > 10.0 {
throw NSError(domain: "your-domain", code: 100, userInfo: [NSLocalizedDescriptionKey: "Error, roll rate too high"])
}
}
,则会在文本字段中为每个击键调用上述方法,否则只有在按Continuously updates value
或失去焦点后才会调用。
注意:要全面了解如何通过绑定更新值,包括Enter
的作用,请参阅文档here。