方案:
我创建了一个覆盖窗口(标签= 100),我最终想要解雇。但是下面的代码不起作用:
UIApplication.shared.windows.first?.becomeKey()
UIApplication.shared.windows.last?.resignKey()
(lldb) po UIApplication.shared.windows
▿ 2 elements
- 0 : <UIWindow: 0x7fa698d0ad00; frame = (0 0; 768 1024); gestureRecognizers = <NSArray: 0x600000048550>; layer = <UIWindowLayer: 0x6000000278a0>>
- 1 : <UIWindow: 0x7fa698d14bb0; frame = (0 0; 768 1024); autoresize = W+H; tag = 100; gestureRecognizers = <NSArray: 0x600000252a50>; layer = <UIWindowLayer: 0x600000229660>>
要么切换或删除叠加窗口的任何想法?
答案 0 :(得分:0)
只需将窗口的isHidden
属性设置为true:
var overlayWindow: UIWindow?
...
overlayWindow?.isHidden = true
overlayWindow = nil // optional
如果您将此窗口的任何引用设置为nil,则窗口将被丢弃。
请注意,您不应该致电resignKey()
。来自its documentation(强调我的):
<强>讨论强>
永远不要直接调用此方法。系统调用此方法 方法和帖子UIWindowDidResignKey让窗口知道它何时 不再是关键。这个方法的默认实现 什么都没有,但是子类可以覆盖它并使用它来执行任务 与重新关键窗口状态有关。
顺便说一下,becomeKey()
也是如此。您可能希望使用makeKey()或makeKeyAndVisible()。
答案 1 :(得分:0)
这基本上是一个由两部分组成的问题。
我了解到我必须keep a reference to the newly-created UIWindow,而不仅仅是本地范围引用。 ......很明显。
一旦我对辅助UIWindow有一个持久的引用,我只能指定它来删除它:
var hamburgerWindow:UIWindow?
@IBAction func displayOverlayWindowAction() {
guard hamburgerWindow != nil else {
displayOverLay()
return
}
hamburgerWindow = nil
}