【问题标题】:How to validate NSTextField content in a modal dialog如何在模式对话框中验证 NSTextField 内容
【发布时间】:2020-12-09 01:56:31
【问题描述】:

我的应用程序有一个带有两个 NSTextField 的模态对话框,上面有“取消”和“确定”按钮。第一个文本字段有一个数字格式化程序,以确保您只能输入整数。

我想在用户尝试在第一个文本字段中输入无效数据时向他们显示警报。这应该显示文本字段何时失去焦点,或者他们是否尝试单击模式的“确定”按钮。

我尝试过的:

为文本字段设置NSTextFieldDelegate

extension ViewController: NSTextFieldDelegate {
    func control(_ control: NSControl, didFailToFormatString string: String, errorDescription error: String?) -> Bool {
        let alert = NSAlert()
        alert.messageText = "Invalid Number"
        alert.informativeText = error ?? "You must enter a number."
        alert.runModal()

        return true
    }
}

问题

上面的代码只是一种工作;当存在无效数据时,它确实会在文本字段失去焦点时显示有用的警报,但是:

  • 然后清空文本字段的内容;我希望无效数据保留在字段中,以便用户更正它
  • 单击“确定”按钮不会触发字段的格式设置,因此不会显示警报。

【问题讨论】:

  • 将他们输入的文本值保存在一个变量中。
  • 第一个问题对我来说似乎是一个错误。 macOS 10.13 不会清空该字段。

标签: swift cocoa appkit nsformatter


【解决方案1】:

单击“确定”按钮不会触发字段的格式设置,因此不会显示警报。

调用makeFirstResponder(nil) 强制格式化内容。如果文本字段拒绝放弃其第一响应者状态,makeFirstResponder 将返回 false

@IBAction func okAction(_ sender: Any) {
    if let window = view.window,
        window.makeFirstResponder(nil) {
        dismiss(self)
    }
}

【讨论】:

  • 谢谢,您的建议奏效了!更好的是,它是有道理的,哈哈。然而,在这种情况下,整个使用 NSFormatters 感觉很硬,并且充满了必须专门编码的边缘情况(可能还有操作系统错误)。最后,我用更少的 LOC 编写了自己的验证器(我可以随时调用)。
猜你喜欢
  • 1970-01-01
  • 2014-03-09
  • 2019-10-17
  • 1970-01-01
  • 2016-12-28
  • 2012-09-15
  • 2011-03-25
  • 2020-12-12
  • 1970-01-01
相关资源
最近更新 更多