makeFirstResponder并不总是开火



我在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])")
        }
    }

我找到了一个博客,让我找到了发生这种情况的原因。默认情况下,在macOS中,NSWindow具有一个isRestorable Boolean值,该值将调用上一个firstResponder的任何内容,而不管设置为initialFirstResponderviewDidAppear中设置了什么,等等。

我发现调用webView.makeFirstResponder((没有任何作用。但是调用视图窗口?。makeFirstResponder(webView(做到了。

不知道为什么。数小时的挫败感。

相关内容

  • 没有找到相关文章

最新更新