2011-12-28 57 views
4

我正在重新創建某種特定於我的應用的UIAlertView,所以我將UIWindow作爲子類來執行此操作。該窗口被添加到[UIApplication sharedApplication].windows,但從未實際顯示。我修剪下來到這個小小的一段代碼:UIWindow的makeKeyAndVisible與ARC玩不好

UIWindow *testWindow = [[UIWindow alloc] initWithFrame:self.view.bounds]; 
testWindow.backgroundColor = [UIColor blueColor]; 
[testWindow makeKeyAndVisible]; 

當我登錄[UIApplication sharedApplication].windows,我看到:

"<UIWindow: 0x83774f0; frame = (0 0; 320 480); opaque = NO; autoresize = RM+BM; layer = <UIWindowLayer: 0x8377660>>", 
"<UIWindow: 0x8382630; frame = (0 0; 300 400); layer = <UIWindowLayer: 0xf573e60>>" 

然而具有藍色背景的顏色,第二個窗口是nowehere待觀察。

UPDATE:這隻有在啓用ARC時纔會出現問題。我創建了2個新的「單視圖」項目,一個啓用ARC,另一個禁用ARC。兩者都是相同的,我將UIWindow代碼添加到主視圖控制器的viewDidAppear:。當我在模擬器中運行應用程序時,藍色窗口僅顯示在ARC禁用的項目中。看起來ARC很快就擺脫了我的UIWindow,所以它甚至沒有時間顯示出來。製作它__strong沒有幫助。仍然一無所知......

回答

11

它看起來像ARC被過快地擺脫我的一個UIWindow的,所以它甚至沒有時間來證明了。製作它__strong沒有幫助。

製作什麼__strong?你在問題中顯示的變量看起來是一個局部變量,只有在方法返回時才存在。當方法返回時,變量消失,所以沒有東西擁有窗口,所以它會被釋放。

將窗口的指針分配給__strong實例變量或strong屬性。那麼你將擁有一個更持久的所有權保持窗口活着。關閉窗口後,將伊娃或財產設置爲nil

作爲一個方面說明,你確定你想這是UIWindow的一個子類而不是UIView?即使UIAlertView是一個視圖,而不是一個窗口。如果它創建了自己的窗口,您可能想要這樣做 - 讓視圖創建自己的窗口作爲實現細節。

+0

這回答了很多問題,謝謝! – samvermette 2011-12-29 02:43:39

+4

正如你所推薦的,我最終將它變成了一個UIView子類,它又創建了自己的UIWindow。爲了讓這個窗戶成爲一個強大的屬性,我放心,當我將它設置爲零時,窗口會被保留,顯示和刪除。感謝你,ARC更有意義! – samvermette 2011-12-29 03:08:43

0
  1. 的文檔提到,你應該使用UIScreen來確定邊界:[[UIScreen mainScreen] bounds]
  2. 我不知道它是必需的,但你不加入UIView到你的窗口。
  3. 我注意到opaque = NO - 嘗試[window setOpaque:NO];或類似的東西。
  4. 我測試你的代碼,並得到:

    應用程序窗口預計將有在應用程序啓動的最後一個根視圖控制器

    所以基本上,使用[window setRootViewController:...];。不要問我爲什麼,這對我來說似乎並不需要。

+0

不幸運:(更新了我的原始問題與代碼 – samvermette 2011-12-28 21:24:23

+0

仍然沒有:( – samvermette 2011-12-28 21:28:50

+0

...並再次:-)這一次它應該幫助 – 2011-12-28 21:33:46