我有一个NSSearchField
在一个NSToolbar
内,我正试图设置makeFirstResponder
打开,但它是间歇性工作。有时NSSearchField
将成为第一个响应者,而不调用makeFirstResponder
,makeFirstResponder
将返回true
,就好像设置成功一样。设置NSWindow.initialFirstResponder
也失败。
class ViewController: NSViewController {
override func viewDidAppear() {
super.viewDidAppear()
view.window?.makeFirstResponder(view.window?.windowController?.searchField
}
}
我已经通过使用计时器延迟代码获得了一致的工作结果,但这不是一个理想的解决方案。
class ViewController: NSViewController {
override func viewDidAppear() {
super.viewDidAppear()
Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { _ in
self.view.window?.makeFirstResponder(self.windowController?.searchField)
}
}
}
最佳答案
如果makeFirstResponder
返回true
,则it很可能至少在短时间内成为第一响应者。
您可以使用NSWindow.firstResponder
符合KVO的事实,以便在ViewController
类中使用如下代码检测对它的任何更改:
override func viewDidAppear() {
super.viewDidAppear()
self.view.window?.addObserver(self, forKeyPath: "firstResponder", options: [.initial, .new], context: nil)
self.view.window?.makeFirstResponder(self.windowController?.searchField)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "firstResponder" {
print("First responder of window: \(object) is \(change?[NSKeyValueChangeKey.newKey])")
}
}
关于swift - makeFirstResponder并不总是会触发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55719308/