如何在模态对话框中验证 NSTextField 内容

How to validate NSTextField content in a modal dialog

我的应用有一个模态对话框,上面有两个 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
    }
}

问题

以上代码仅能正常工作;当存在无效数据时,它会在文本字段失去焦点时显示有用的警报但是:

clicking the OK button does not trigger the field's formatting and thus the alert does not show.

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

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