【问题标题】:How to remove a UIWindow?如何删除 UIWindow?
【发布时间】:2010-12-28 07:47:30
【问题描述】:

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

谢谢:)

【问题讨论】:

  • 你能解释/详细说明你在做什么吗?由于问题不是太清楚。可能是我错了。

标签: iphone cocoa-touch ios ios4 uiwindow


【解决方案1】:

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

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

【讨论】:

  • can't work now , ios 12 , 在 makeKeyWindow 之后似乎无法从 UIApplication 的窗口中删除它。
  • 它不再删除 keywindow 并且列表不断增长。还有其他想法吗?
  • 任何反馈@adev ?
  • @JERC,不。我找不到任何解决方案。我只是暂时隐藏它,它也没有从该列表中释放。
  • 对窗口有一个强引用,然后在完成后将引用设置为 nil 就足以在 iOS 13 中将控制切换回初始窗口。
【解决方案2】:

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

【讨论】:

  • 这确实改变了哪个窗口是 keyWindow,但似乎并没有从 application.windows 中删除它......
  • 自定义窗口的超级视图为空。只需将其隐藏为 NO
  • 下面的答案(来自 Nikolai Ruhe)告诉您如何实际移除窗户
  • 我比 Nikolai Ruhe 早两年回答了这个问题,甚至在 ARC 出现之前。
【解决方案3】:

以下是如何以向后兼容的方式在 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()

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

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

        我们现在可以通过应用代理的window 属性访问默认窗口。

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

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

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

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

          • 正如其他一些帖子中提到的,您不应该直接致电resignKeyWindow
          猜你喜欢
          • 1970-01-01
          • 2011-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          • 1970-01-01
          • 2012-06-15
          • 1970-01-01
          相关资源
          最近更新 更多