開發中常常須要自定義彈窗的需求,通常實現方式無非就是 拿到 APPDelegate 的 window,將咱們本身的 彈窗 view add進去。其實參照系統的 UIAlert 和 UIActionSheet,還能夠本身建立 UIWindow
,而後調整這個 window 的 window level
來控制層級, 去顯示這個 window
。windows
這時候就發現了一個巨坑。數組
建立 window 的方法就是 初始化就好:bash
let window = UIWindow(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight))
複製代碼
可是讀取當前已經顯示的 window 的時候發現一個問題ui
let topWindow = UIApplication.shared.windows.last
複製代碼
UIApplication.shared.windows
數組的個數竟然不是當前以顯示的個數,而是前面已經建立 Window 的個數,例如:spa
let w1 = UIWindow(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight))
let w2 = UIWindow(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight))
let w3 = UIWindow(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: kScreenHeight))
複製代碼
這樣連續建立多個 window。那麼打印出來的 UIApplication.shared.windows
的結果就是:code
▿ 5 elements
- 0 : <PaintingWindow: 0x11be07d80; baseClass = UIWindow; frame = (0 0; 375 812); gestureRecognizers = <NSArray: 0x280bb0360>; layer = <UIWindowLayer: 0x28057d6a0>>
- 1 : <UIWindow: 0x11d806d40; frame = (0 0; 375 812); hidden = YES; gestureRecognizers = <NSArray: 0x280bb74e0>; layer = <UIWindowLayer: 0x280555f20>>
- 2 : <UIWindow: 0x11dc0bc40; frame = (0 0; 375 812); hidden = YES; gestureRecognizers = <NSArray: 0x280bf0e70>; layer = <UIWindowLayer: 0x2805551e0>>
- 3 : <UIWindow: 0x11d903590; frame = (0 0; 375 812); hidden = YES; gestureRecognizers = <NSArray: 0x280bf27c0>; layer = <UIWindowLayer: 0x28051f0a0>>
- 4 : <UIWindow: 0x11d901790; frame = (0 0; 375 812); hidden = YES; gestureRecognizers = <NSArray: 0x280bf29a0>; layer = <UIWindowLayer: 0x28051f1e0>>
複製代碼
原來只要初始化了 window,那麼就自動給加入到了UIApplication.shared.windows
中了,在釋放 window 以後,window 會自動從 UIApplication.shared.windows
中刪除。element