Swift macOS NSTextField 响应键盘按键 Enter 回车键,或者其它按键
需求
举例子演示,需要实现这样的功能:
在第一个输入框按回车时,光标跳入第二个输入框,在第二个输入框中按回车时,执行添加词组的命令。
一、继承 NSTextFieldDelegate
protocal 并设置 delegate
NSViewController
BuddyVC 里面有两个 NSTextField
codeTextField 和 wordTextField,
在 viewDidLoad()
中将对应 NSTextField
的 delegate
设为 self
class BuddyVC: NSViewController, NSTextFieldDelegate {
@IBOutlet weak var codeTextField: NSTextField!
@IBOutlet weak var wordTextField: NSTextField!
override func viewDidLoad() {
super.viewDidLoad()
codeTextField.delegate = self
wordTextField.delegate = self
}
}
二、重要实现内容
实现 control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool
方法,这个方法是接收并处理用户输入的按键操作的
参数 | 说明 |
---|---|
control | 是指发送按键请求的 control,这里是指对应的 NSTextField ,需要手动转一下类 |
commandSelector | 对应输入的键 |
返回值
- 返回
true
,表示这个请求你自己处理了 - 返回
false
,表示这个请求你不作处理,交给系统处理。一定不要忘了返回false
,如果忘了,其它一些你没有进行处理的删除操作等都无法使用了
func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
switch commandSelector {
// 当检测到按键是 Enter 回车键时,
// 对应的其它按键可以去 NSResponder 中查看,这里中列举了 Enter 这个键
case #selector(NSResponder.insertNewline(_:)):
// 这里面就是当按下 Enter 键时,你需要做的一些东西了
// 1. 判断发送这个按键的 control 是不是 NSTextField
if let inputView = control as? NSTextField {
// 2. 当在 codeTextField 按下回车时
if inputView == codeTextField {
wordTextField.becomeFirstResponder() // 2.1 光标移动到用户词输入框
} else {
// 3. 当在 wordTextField 按下回车时
addWord() // 3.1 去执行添加用户词的方法
}
}
// 3. 当你处理了对应的按键操作时,返回 true
return true
default:
// 4. 默认返回 false,表示其它按键操作不会自己处理,交给系统处理
return false
}
}