【发布时间】:2017-07-07 03:35:46
【问题描述】:
我正在使用 Swift 开发 Cocoa 应用程序。该应用程序打开一个窗口,用户可以使用菜单打开另一个窗口。问题是当使用红色按钮关闭任一窗口时,应用程序将终止。我不想要那种行为;我希望应用程序保持活力。它没有崩溃; AppDelegate 的 applicationWillTerminate 方法执行。
AppDelegate 有方法 applicationShouldTerminateAfterLastWindowClosed,它返回 false,但这个方法永远不会被执行。
我是一个相当称职的 Swift iOS 开发者;这是我的第一个真正的 Cocoa 应用程序,我怀疑这很简单,但我现在很困惑。如何在不完全终止应用的情况下关闭窗口?
编辑:这里有一些代码sn-ps:
在 AppDelegate 中:
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
Log.methodEnter()
return false
}
同样在AppDelegate中,打开窗口的方法:
@IBAction func openVerbSettingsWindow(sender: NSMenuItem) {
verbSettingsWindowController.showWindow (nil)
}
从 windowViewController 中,唯一在窗口加载和显示时执行任何操作的方法:
override func windowDidLoad() {
super.windowDidLoad()
window?.setFrame(NSMakeRect(400.0, 100.0, 950.0, 450.0), display: true)
}
我希望这会有所帮助!
【问题讨论】:
-
这取决于您是使用 NSViewController、NSWindowController 还是仅使用带有 Xib 文件的 AppDelegate。
-
我刚刚在 Xcode 中创建了一个默认的 Cocoa 应用程序,然后运行它,当我关闭窗口时,它并没有退出——所以这听起来像是你正在做的事情。你的程序是什么?可以看源码吗?
-
当我开始编写这个应用程序时,它可以工作,但是当我添加第二个窗口时,终止行为开始了。所以它一定与第二个窗口有关,但我肯定不知道它是什么!为了响应 El Tomato,第二个窗口是一个 NSWindow,它由一个 NSWindowController 子类控制,它使用一个 .XIB 文件。
-
您的 AppDelegate 在哪里创建?是在MainMenu界面文件中吗?如果是这样,它实际上是作为应用程序的代理连接在那里的吗?如果没有,你在哪里设置它作为委托?
-
AppDelegate 位于 MainMenu 接口文件中,并且也与那里的应用程序委托挂钩。