我觉得[myWindow resignKeyWindow]
和[self.window makeKeyAndVisible]
很容易,但我猜不是......你们不知道该怎么办?
谢谢:)
答案 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];