os x nstextfield验证

时间:2016-10-24 13:07:09

标签: swift macos

我的NSViewController中有一个变量:

dynamic var roll_rate:Double = 0.0

我将其附加到NSTextField

enter image description here

模型关键路径显示错误,但它正在工作:当我在字段中更改值时,变量也会更改。但是意味着什么: Validates Immediately以及如何显示和检查字段的验证错误。

我尝试了实施方法validateRoll_rate,但在价值发生变化时没有调用。

1 个答案:

答案 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