如何在非文档型Storyboard应用程序中处理applicationShouldHandleReopen方法

12

我能够找到的最好答案是:

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
}

但是这需要我在我的应用程序委托上设置一个对窗口的引用。由于在应用程序最初启动时不需要这样做,我相当肯定我做错了什么,同时错过了一些显而易见的东西。

这个解决方案似乎也可以工作。

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
}

我不知道为什么苹果不对此提供指导,或者让您从故事板设置窗口的出口。这似乎是一个常见的需求。也许我还缺少一些东西。

2个回答

11

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
    }

7

如果您正在寻找一种基于Cocoa的解决方案,用于非文档应用程序。这相当于Adam的第二种解决方案。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接