为啥我看不到我的新 UIWindow?

Posted

技术标签:

【中文标题】为啥我看不到我的新 UIWindow?【英文标题】:Why do I not see my new UIWindow?为什么我看不到我的新 UIWindow? 【发布时间】:2017-05-27 18:34:42 【问题描述】:

场景:创建并显示一个覆盖(辅助)UIWindow。 相关讨论: How do I toggle between UIWindows?

代码:

fileprivate func displayOverLay() 
    let myWindow = () -> UIWindow in
        let cWindow = UIWindow(frame: CGRect(x: 10, y: 200, width: 300, height: 300))
        cWindow.backgroundColor = UIColor.gray.withAlphaComponent(0.5)
        cWindow.tag = 100
        return cWindow
    ()
    myWindow.makeKeyAndVisible()
    myWindow.windowLevel = UIWindowLevelAlert
    let storyboard = UIStoryboard(name: "Hamburger", bundle: nil)
    let vc = storyboard.instantiateInitialViewController()
    myWindow.rootViewController = vc
    return

这是共享的 UIApplication 窗口状态:

(lldb) po UIApplication.shared.windows 
▿ 2 elements
  - 0 : <UIWindow: 0x7fcffc804860; frame = (0 0; 375 667); autoresize = W+H; gestureRecognizers = <NSArray: 0x600000051280>; layer = <UIWindowLayer: 0x60000003e840>>
  - 1 : <UIWindow: 0x7fcff9407240; frame = (10 200; 300 300); tag = 100; gestureRecognizers = <NSArray: 0x608000052810>; layer = <UIWindowLayer: 0x608000220420>>


(lldb) po UIApplication.shared.keyWindow!
<UIWindow: 0x7fcff9407240; frame = (10 200; 300 300); tag = 100; gestureRecognizers = <NSArray: 0x608000052810>; layer = <UIWindowLayer: 0x608000220420>>

结果如下:没有灰色的窗口画面


重要提示:如果我在 displayOverLay() 结束时刹车并执行“po myWindow”,然后继续,我会得到显示。

所以它似乎 我错过了某种事件 让 UIWindow 出现。 需要什么来强制真正显示带有内容的新 UIWindow?

【问题讨论】:

您需要保留对窗口的引用。您需要将其声明为主控制器的属性,否则当您的方法完成运行时它将超出范围。 正确!有用。这是新的区域参考:var hamburgerWindow:UIWindow? 【参考方案1】:

您需要保留对已创建窗口的引用,否则 ARC 将在您从函数返回后处理该窗口。

例如,您可以从您的函数中返回新创建的窗口,并将其存储在您从中调用该函数的类的属性中。

【讨论】:

以上是关于为啥我看不到我的新 UIWindow?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 apache 看不到我的 python 模块?

为啥我在编辑发票时看不到我的发票项目?

为啥我的模拟器上看不到 XML 元素?

为啥链接器看不到我的函数(定义宏来替换系统日志)?

为啥 Heroku 找不到我的 Django 模板?

为啥 Heroku 找不到我的 Django 模板?