gpt4 book ai didi

swift - makeFirstResponder 并不总是触发

转载 作者:行者123 更新时间:2023-11-28 13:43:38 29 4
gpt4 key购买 nike

我在 NSToolbar 中有一个 NSSearchField,我试图将其设置为 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,那么它可能至少在短时间内成为第一响应者。

您可以使用 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com