如何删除UIWindow?

时间:2010-12-28 07:47:31

标签: iphone cocoa-touch ios ios4 uiwindow

我觉得[myWindow resignKeyWindow][self.window makeKeyAndVisible]很容易,但我猜不是......你们不知道该怎么办?

谢谢:)

7 个答案:

答案 0 :(得分:72)

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

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

答案 1 :(得分:14)

不要直接调用-resignKeyWindow,当你的UIWindows被删除时,它被覆盖以执行一些代码。为了删除旧窗口,您需要创建UIWindow的新实例并使其成为-makeKeyAndVisible,旧窗口将重新签名其关键状态。在iOS 4中,它甚至会垃圾收集旧的 UIWindow ,前提是您没有任何引用它。在iOS 3.x中执行此操作会产生灾难性后果。警告你。

答案 2 :(得分:7)

以下是在iOS 13上以向后兼容的方式删除UIWindow的方法。在具有多窗口支持的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()

答案 3 :(得分:0)

您无法从应用代表中删除该窗口。但是,您可以删除创建的任何自定义窗口。

要删除窗口,您必须先提供替换。所以我们得到了默认窗口。

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

我们现在可以通过app delegate的window属性访问默认窗口。

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

调用makeKeyandVisible会删除所有窗口,并将应用委托的窗口指定为关键窗口。将rootViewController设置为刚创建的导航控制器,你就可以了!

DEMONavigationController *demoNav = [[DEMONavigationController alloc]initWithRootViewController:self];
[appDelegate.window makeKeyAndVisible];
appDelegate.window.rootViewController = demoNav;

答案 4 :(得分:0)

如果您有除app窗口之外的任何窗口,请使用它..

let mainWindow = UIApplication.shared.delegate?.window
mainWindow??.makeKeyAndVisible()

答案 5 :(得分:0)

此扩展程序在更多情况下为我提供了帮助:

/// 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
    }
}

答案 6 :(得分:-8)

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

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

[self.window.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
self.window.rootViewController = nil;
[self.window resignKeyWindow];
[self.window removeFromSuperview];