我打算做的是验证四个NSTextFields,我将努力确保它们都被正确、完整地填充。
如图所示:如果用户在第1 NSTextField中键入任何内容,键入错误或在第2 NSTextField中留下空白的,按Enter或单击边界外,它应该显示警告,并尝试阻止用户从第2 NSTextField辞职,他应该确认他在第2 NSTextField中的输入。
我尝试过的东西和我面临的问题:
当我打字的时候。错误,显示警报并返回false。运行得很好。
但是,如果我不输入任何内容,textFieldShouldEndEditing(_:)就不会调用。(因为不输入就不会触发)
func control(_ control: NSControl, textShouldEndEditing fieldEditor: NSText) -> Bool {
if control.stringValue != validInput{
showAlert()
return false
}else{
return true
}
}// plz ignore the delegation当用户单击NSTextField时,NSTextField将是becomeFirstResponder(),然后是ResignFirstResponder(),因为FieldEditor会进入。因此,监视resignFirstResponder()是无效的。
当我键入错误或输入nothing时,按回车或单击边界外,显示警告,但很难停止下列功能:例如,如果我单击“打开”按钮,它可能同时显示警报和openFile对话框。
什么能解决我的问题:
发布于 2022-02-08 09:54:45
我发现编写自定义fieldEditor并不像我想象的那么困难。遵循教程这里。我在这里为任何面临类似问题的人发布了我的代码的基本部分。
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")
}
}https://stackoverflow.com/questions/70995887
复制相似问题