Macos 从ViewDidDisplay显示的模式窗口会导致主窗口焦点丢失

Macos 从ViewDidDisplay显示的模式窗口会导致主窗口焦点丢失,macos,modal-dialog,focus,nsviewcontroller,Macos,Modal Dialog,Focus,Nsviewcontroller,在我的MacOS程序中,我展示了一个模式窗口。代码很简单: class BuyViewController: NSViewController { static func showDialog() { let storyboard = NSStoryboard(name: "Main", bundle: nil) let windowController = storyboard.instantiateController(withIdentifier:

在我的MacOS程序中,我展示了一个模式窗口。代码很简单:

class BuyViewController: NSViewController {
    static func showDialog() {
        let storyboard = NSStoryboard(name: "Main", bundle: nil)
        let windowController = storyboard.instantiateController(withIdentifier: "BuyViewController") as! NSWindowController
        let window = windowController.window!
        let application = NSApplication.shared
        application.runModal(for: window)
        window.close()
    }
    @IBAction func buyAction(_ sender: Any) {
        // Do processing here
        NSApplication.shared.stopModal()
    }
    @IBAction func cancelAction(_ sender: Any) {
        NSApplication.shared.stopModal()
    }
}
当我将BuyViewController.showDialog()作为用户启动的操作调用时,代码运行良好。但是,如果我从主视图控制器的ViewDidDisplay()调用showDialog,那么当用户退出buy窗口时,主窗口将缺少焦点。应用程序菜单上的许多功能都是灰色的,主窗口的标题栏是浅灰色的。单击主窗口中的任意位置可恢复焦点

stopModal应该将焦点返回到上一个窗口。从主窗口ViewDidDisplay调用showDialog似乎会阻止主窗口建立为要返回的上一个窗口


我怎样才能解决这个问题?

谢谢,马瑞克。将调用移动到ApplicationIDFinishLaunching解决了这个问题。

我假设窗口尚未完全加载,因为当我在视图中执行DispatchQueue.main.asyncAfter(截止日期:DispatchTime.now()+.seconds(1))时,焦点未正确返回。也可能是错误。在ApplicationIDFinishLaunching中调用showDialog会正确返回焦点。因此,问题是您的应用程序未完全加载(您调用NSApplication shared来执行模态循环,因此需要加载它)。另一种方法是在viewController中调用PresentViewControlleraModalWindow,这样就不需要等待nsapp