【问题标题】:How to re-open the Mac Desktop App after closing it by using X?使用X关闭Mac桌面应用程序后如何重新打开它?
【发布时间】:2012-08-11 07:30:31
【问题描述】:

我已经为 Mac 桌面创建了一个应用程序,它正在运行,但 Apple 拒绝了它,因为当我们运行该应用程序并使用“X”关闭它时,我们无法通过应用程序图标从 Dock 重新打开它仍然存在,但它不会再次打开应用程序,我正在努力的主要问题是“如果我们关闭应用程序,那么在菜单栏中没有选项可以打开它”我见过的其他应用程序就是这样做的.

我该怎么办?

【问题讨论】:

  • “使用 X 关闭它”是什么意思?此外,是什么阻止您调试和修复您的应用程序以使其正常工作?毕竟是你写的,所以你知道它是如何工作的,对吧?
  • 使用X关闭是指App最左角的X(关闭)按钮。
  • 我现在可以使用此链接从 Dock 重新启动应用程序:stackoverflow.com/questions/5498376/… 但如何显示在菜单栏中打开的选项?
  • 所以当您说“X”时,您对 Windows 感到困惑,您的意思是 红色按钮?与 Windows 不同,该按钮应该只关闭 window - 它应该 退出应用程序。阅读 Apple UI 指南 - 如果您试图让 Mac OS X 应用程序像 Windows 程序一样运行,您会严重惹恼您的用户。
  • 我有一个相关的信息要分享。如果您在带有 Swift 5.2 的 MacOS 10.15 上使用 xcode 11.4,MacOS SwiftUI 应用程序中也存在同样的问题。在 AppDelegates.swift 中添加以下代码可以解决该问题。 func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { if !flag{ window.makeKeyAndOrderFront(nil) } return true }

标签: objective-c xcode cocoa


【解决方案1】:

这是 Swift 3 的答案:

在 View Controller 类中符合 NSWindowDelegate。然后通过覆盖以下方法隐藏窗口而不是关闭它。

self.view.window?.delegate = self

func windowShouldClose(_ sender: Any) -> Bool {
    NSApplication.shared().hide(self)
    return false
}

然后在 Dock 中单击应用程序图标时取消隐藏应用程序。

func applicationDidBecomeActive(_ notification: Notification) {
    NSApplication.shared().unhide(self)
}

【讨论】:

  • 自我是另一个自我!
  • 和 applicationDidBecomeActive 仅在 appdelegate 中调用
【解决方案2】:

要为红色 (x) 按钮实现简单的显示/隐藏功能,请将您的 App Delegate 类也设为主窗口的窗口代理。

然后在其中添加以下代码:

- (BOOL)windowShouldClose:(id)sender {
    [[NSApplication sharedApplication] hide:self];

    return NO;
}

- (void)applicationDidBecomeActive:(NSNotification *)notification {
    [[NSApplication sharedApplication] unhide:self];
}

【讨论】:

    【解决方案3】:

    我对 swift 5/Xcode 10 的 2 个证书

    注意:您也可以在 ViewController 中调用这些方法(如果有用),以防止在 NASWindow/NSView-Controller 之间拆分代码。 在这种情况下:

    class ViewController: NSViewController, **NSWindowDelegate**
    {
    

    ...

    override func viewWillAppear() {
        // we choose to delegate ourselves. must be done here, in viewDidLoad window is nil
        let window = self.view.window
        window!.delegate = self
    }
    

    ...

    无需通过自我.. :(与上面的其他人一样。)

       func windowShouldClose(_ sender: NSWindow) -> Bool {
    
            NSApplication.shared.hide(nil)
    
            return false // prevent closing.
        }
    
    
        func applicationDidBecomeActive(_ notification: Notification) {
            NSApplication.shared.unhide(nil)
        }
    

    【讨论】:

      猜你喜欢
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 2014-05-08
      相关资源
      最近更新 更多