2011-01-10 46 views
0

我的應用程序有一個歡迎屏幕,只能以縱向模式顯示。在用戶點擊歡迎屏幕後,我想顯示可以在縱向模式和橫向模式中使用的另一個屏幕。如何從視圖層次結構中刪除視圖控制器?

我已經建立了一個實現shouldAutorotateToInterfaceOrientation:只爲UIInterfaceOrientationPortrait返回YES視圖控制器,和我的視圖添加到窗口[window addSubView:view]。我用標籤1來標記此視圖。

當用戶點擊在歡迎視圖和新視圖的應用程序動作我做的:

[[window viewWithTag:1] removeFromSuperView]; 
[window addSubView:myViewController.view]; 

哪裏myViewController是第二視圖的視圖控制器的一個實例(即妥善處理shouldAutorotateToInterfceOrientation法) 。

現在,當我旋轉時,它仍然在原始視圖的視圖控制器上調用shouldAutorotateToInterfceOrientation,並且不會在新視圖的視圖控制器上調用它。

This note from Apple說只有一個視圖控制器會得到旋轉通知;不過,我已經刪除了其他視圖控制器。

我在做什麼錯?

回答

1

實際上,該注並沒有說「只有一個視圖控制器會得到通知」,而是它說「只有第一個視圖控制器添加到UIWindow纔會旋轉」。 所以這可能是問題所在。

要解決它,我會說總是有一個視圖添加到您的窗口(稱爲永久),並添加您的歡迎屏幕和下一個視圖到這個永久視圖。

希望這會有所幫助。

1

爲您鏈接到狀態的筆記本:

只有第一個視圖控制器加入到 一個UIWindow將旋轉。

所以把一個標誌,可以確保shouldAutorotateToInterfceOrientation;否,直到用戶已經駁回了屏幕 - 然後返回YES之後。這是一個簡單而有效的解決方案 - 但是,從代碼可讀性的角度來看,可能會令人困惑的是,「解散」視圖實際上控制着旋轉。

個人;我的經驗是,旋轉一些視圖並且一些視圖不旋轉是不值得的 - 而用戶往往不喜歡它。

編碼快樂

1

我寫了一個快速測試,顯示你正在嘗試做的應該工作。這裏是我做的基礎知識:

創建兩個視圖控制器。應用程序首先將在AppDelegate中設置的第一個視圖控制器通過NIB文件轉換爲實例變量viewController。然後按照你的寫法將它添加到窗口中。

然後我設置一個動作,當被調用時(可能是一個定時器,第一個視圖控制器上的按鈕等)執行以下操作:

使用[self.viewController removeFromSuperview]移除視圖。這與您使用標籤完成的方式不同。

創建第二個視圖控制器並將其分配給self.viewController。

已添加到您指定的窗口。

不知道你的代碼有什麼不對。我猜想也許第一個觀點並沒有真正被刪除。

+0

所以只有原始的視圖控制器被通知旋轉? – 2011-01-11 20:12:39

相關問題