37

我认为这很容易[myWindow resignKeyWindow][self.window makeKeyAndVisible]但我想不是……你们知道该怎么做吗?

谢谢 :)

4

7 回答 7

97

隐藏窗口的正确方法是将hidden属性设置为 YES。要从 UIApplication 的windows属性中删除它,您只需释放窗口(在 ARC 中,您将所有引用设置为 nil)。

当然,此时您可能希望有另一个窗口。

于 2013-01-18T17:05:02.403 回答
16

不要-resignKeyWindow直接调用,当你的 UIWindows 被删除时,它应该被重写以执行一些代码。为了删除旧窗口,您需要创建 UIWindow 的新实例并制作它-makeKeyAndVisible,旧窗口将放弃其关键状态。在 iOS 4 中,它甚至会垃圾收集您的旧UIWindow,前提是您没有对它的任何引用。在 iOS 3.x 中这样做会产生灾难性的影响。警告你。

于 2011-02-27T00:00:37.403 回答
10

以下是如何UIWindow以向后兼容的方式在 iOS 13 上删除。在支持多窗口的 iOS 12、iOS 13、iPadOS 上测试:

extension UIWindow {
    func dismiss() {
        isHidden = true

        if #available(iOS 13, *) {
            windowScene = nil
        }
    }
}

用法:

// Detect key window
let keyWindow = UIApplication.shared.windows.first { $0.isKeyWindow }

// Dismiss key window (if any)
keyWindow?.dismiss()
于 2020-01-30T14:42:51.763 回答
2

这个扩展在更多情况下帮助了我:

/// Removes window from windows stack
func remove() {
    rootViewController?.view.removeFromSuperview()
    rootViewController = nil
    isHidden = true
    
    // https://stackoverflow.com/a/59988501/4124265
    if #available(iOS 13.0, *) {
        windowScene = nil
    }
}
于 2020-11-03T18:29:09.983 回答
0

您不能从应用委托中删除窗口。但是,您可以删除任何创建的自定义窗口。

要卸下窗户,您必须先提供替换件。所以我们得到了默认窗口。

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

window我们现在可以通过应用程序委托的属性访问默认窗口。

现在获取原始或自定义导航控制器。将自己分配给rootViewController.

调用makeKeyandVisible会删除所有窗口并将应用程序委托的窗口分配为关键窗口。将 rootViewController 设置为您刚刚创建的导航控制器,一切顺利!

DEMONavigationController *demoNav = [[DEMONavigationController alloc]initWithRootViewController:self];
[appDelegate.window makeKeyAndVisible];
appDelegate.window.rootViewController = demoNav;
于 2016-07-01T14:28:48.883 回答
0

如果您有除应用程序窗口以外的任何窗口,请使用它..

let mainWindow = UIApplication.shared.delegate?.window
mainWindow??.makeKeyAndVisible()
于 2018-01-19T06:58:22.673 回答
-9

我有同样的问题,它可能会有所帮助。

您需要在删除和释放窗口之前销毁所有强引用,尤其是 rootWindowController。我认为下面的代码足以删除任何窗口:

[self.window.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
self.window.rootViewController = nil;
[self.window resignKeyWindow];
[self.window removeFromSuperview];
于 2013-01-08T04:12:27.590 回答