首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(Swift)如何检测"fieldEditor“resignFirstResponder() (Mac/Cocoa)

(Swift)如何检测"fieldEditor“resignFirstResponder() (Mac/Cocoa)
EN

Stack Overflow用户
提问于 2022-02-05 06:53:01
回答 1查看 79关注 0票数 1

我打算做的是验证四个NSTextFields,我将努力确保它们都被正确、完整地填充。

textField和警报

如图所示:如果用户在第1 NSTextField中键入任何内容,键入错误或在第2 NSTextField中留下空白的,按Enter或单击边界外,它应该显示警告,并尝试阻止用户从第2 NSTextField辞职,他应该确认他在第2 NSTextField中的输入。

我尝试过的东西和我面临的问题:

  1. 使用textFieldShouldEndEditing(_:)

当我打字的时候。错误,显示警报并返回false。运行得很好。

但是,如果我不输入任何内容,textFieldShouldEndEditing(_:)就不会调用。(因为不输入就不会触发)

代码语言:javascript
复制
 func control(_ control: NSControl, textShouldEndEditing fieldEditor: NSText) -> Bool {
    if control.stringValue != validInput{
       showAlert()
       return false
    }else{
       return true
    }        
}// plz ignore the delegation
  1. CustomNSTextField & resignFirstResponder()

当用户单击NSTextField时,NSTextField将是becomeFirstResponder(),然后是ResignFirstResponder(),因为FieldEditor会进入。因此,监视resignFirstResponder()是无效的。

  1. 使用textFieldShouldEndEditing(_:)

当我键入错误或输入nothing时,按回车或单击边界外,显示警告,但很难停止下列功能:例如,如果我单击“打开”按钮,它可能同时显示警报和openFile对话框。

什么能解决我的问题:

  1. 当textFieldDidBeginEditing resignFirstResponder()时是否有调用NSTextField (_:)的技巧?
  2. 是否有一个监视窗口当前fieldEditor resignFirstResponder()的函数,它可以返回false,而我希望用户确认他的输入。
EN

回答 1

Stack Overflow用户

发布于 2022-02-08 09:54:45

我发现编写自定义fieldEditor并不像我想象的那么困难。遵循教程这里。我在这里为任何面临类似问题的人发布了我的代码的基本部分。

代码语言:javascript
复制
class CustomFieldCell: NSTextFieldCell {
    static var durationFieldEditor: CustomFieldEditor = {
        let customFieldEditor = CustomFieldEditor()
        return fieldEditor
    }()

    override func fieldEditor(for controlView: NSView) -> NSTextView? {
        return Self.customFieldEditor
    }
}

class CustomFieldEditor: NSTextView {

    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        commonInit()
    }

    override init(frame frameRect: NSRect, textContainer container: NSTextContainer?) {
        super.init(frame: frameRect, textContainer: container)
        commonInit()
    }

    override func becomeFirstResponder() -> Bool {
        // condition
        return super.becomeFirstResponder()
    }

    override func resignFirstResponder() -> Bool {
        // condition
        return super.resignFirstResponder()
    }

    private func commonInit() {
        isFieldEditor = true
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70995887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档