【问题标题】:Cocoa app: how to close a window without terminating the app?可可应用程序:如何在不终止应用程序的情况下关闭窗口?
【发布时间】: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 接口文件中,并且也与那里的应用程序委托挂钩。

标签: swift cocoa


【解决方案1】:

我对这个问题的答案并不感到尴尬;它与 Cocoa 或我的代码无关。

我有一个名为 RedQuits 的应用程序,它将 OS X 配置为在该应用程序的最后一个窗口关闭时关闭该应用程序,而不是让该应用程序在没有窗口的情况下运行(OS X 默认行为)。当我摆脱 RedQuits 并重新启动以使 OS X 恢复其默认行为时,问题就消失了。出于某种原因,当 any 应用程序窗口关闭时,RedQuits 会导致我的 Cocoa 应用程序退出。有趣的是,我发现这一点是因为它在 Xcode 中导致了相同的行为:关闭一个项目窗口并关闭 Xcode。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多