如何在非基于文档的Storyboard应用程序中处理applicationShouldHandleReopen

时间:2015-01-14 21:53:20

标签: 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 NSWindowController

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

    return true
}

但是这需要我在我的app委托上设置一个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
}

以下是我在NSApplicationDelegate

中找到的第三种解决方案
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
}

我不知道为什么Apple不提供相关指导,或者让您从窗口的故事板中设置插座。这似乎是一件普通的事情。也许我还在遗漏一些东西。

2 个答案:

答案 0 :(得分:6)

如果您正在为非文档应用寻找基于可可的解决方案。这相当于亚当的第二个解决方案。

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

答案 1 :(得分:5)

Swift 3 :在AppDelegate.swift中添加一个类型为NSWindow的变量

lazy var windows = NSWindow()

并实现applicationShouldHandleReopen:

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
    }