我有一个NSSearchField在一个NSToolbar内,我正试图设置makeFirstResponder打开,但它是间歇性工作。有时NSSearchField将成为第一个响应者,而不调用makeFirstRespondermakeFirstResponder将返回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/

10-12 13:37