Cocoa通过绑定抑制格式化程序错误



我有一个NSTextField与NumberFormatter。没有将值绑定到任何东西,输入无效值并按tab/enter将只会发出蜂鸣声并将焦点保留在字段中。这太棒了。

我需要我的控制器接收值的持续更新,所以我创建了一个绑定,但突然发现行为发生了变化。现在,无效输入将显示模态错误。我不明白为什么它会改变,但我的问题是:我如何在使用绑定时获得原始的无错误呈现行为?

我尝试过的一件事是将以下NSControlTextEditingDelegate函数添加到我的控制器:

func control(_ control: NSControl, didFailToFormatString string: String, errorDescription error: String?) -> Bool {
return true
}

func control(_ control: NSControl, textShouldEndEditing fieldEditor: NSText) -> Bool {
do {
try self.commitEditingWithoutPresentingError()
return true
} catch {
return false
}
}

但是它挂在commitEditingWithoutPresentingError()上。(不确定这个函数是否有bug,我在其他地方尝试过,当有无效输入时,它也会挂起,而commitEditing()工作正常。)

在任何情况下,我觉得应该有一个相对直接的实现这一点,考虑到它是默认行为绑定不使用时,所以有一些简单的我错过了吗?

回想起来,我错过了一个相当明显的解决方案。假设你的绑定不允许nil,你可以只检查control。objectValue为nil,检查输入是否无效:

func control(_ control: NSControl, didFailToFormatString string: String, errorDescription error: String?) -> Bool {
return true
}

func control(_ control: NSControl, textShouldEndEditing fieldEditor: NSText) -> Bool {
if control.objectValue == nil {
NSSound.beep()
return false
}
return true
}

最新更新