Macos 如何在非基于文档的故事板应用程序中处理应用程序HouldHandlereopen

Macos 如何在非基于文档的故事板应用程序中处理应用程序HouldHandlereopen,macos,cocoa,swift,xcode6,osx-yosemite,Macos,Cocoa,Swift,Xcode6,Osx Yosemite,我能想出的最好办法是: func applicationShouldHandleReopen(sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { if !flag{ let sb = NSStoryboard(name: "Main", bundle: nil) let controller = sb?.instantiateInitialController() as NS

我能想出的最好办法是:

func applicationShouldHandleReopen(sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {

    if !flag{
        let sb = NSStoryboard(name: "Main", bundle: nil)
        let controller = sb?.instantiateInitialController() as NSWindowController

        controller.window?.makeKeyAndOrderFront(self)
        self.window = controller.window
    }

    return true
}
但这需要我在我的应用程序代理上设置一个窗口的ref。因为这在应用程序启动时不是必需的,所以我很肯定我做错了什么,而忽略了一些显而易见的事情

这个解决方案似乎也能奏效

func applicationShouldHandleReopen(sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {

    if !flag{

        for window in sender.windows{
            if let w = window as? NSWindow{
                w.makeKeyAndOrderFront(self)
            }
        }
    }

    return true
}
这是我在您的
nsapplicationelegate
中发现的第三个解决方案:

var mainWindow: NSWindow!

func applicationDidFinishLaunching(aNotification: NSNotification) {
    mainWindow = NSApplication.sharedApplication().windows[0] as! NSWindow
}

func applicationShouldHandleReopen(sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
    if !flag{
        mainWindow.makeKeyAndOrderFront(nil)
    }

    return true
}

我不知道苹果为什么不提供这方面的指导,或者让你从故事板上为窗口设置出口。这似乎是一件平常的事。也许我还缺少一些东西。

以防您正在为非文档应用程序寻找基于可可粉的解决方案。这相当于亚当的第二个解决方案

- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag
{
   if(!flag)
   {
       for(id const window in theApplication.windows)
       {
           [window makeKeyAndOrderFront:self];
       }
   }
   return YES;
}

Swift 3:在AppDelegate.Swift中添加NSWindow类型的变量

lazy var windows = NSWindow()
并实施应用程序HouldHandlereopen:

func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
    if !flag {
        for window in sender.windows {
            window.makeKeyAndOrderFront(self)
        }
    }

    return true
}
或使用forEach:

func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
        if !flag {
            sender.windows.forEach { $0.makeKeyAndOrderFront(self) }
        }

        return true
    }