簡體   English   中英

如何從視圖層次結構中刪除視圖控制器?

[英]How do I remove a view controller from my view hierarchy?

我的應用程序有一個歡迎屏幕,只能在縱向模式下顯示。 在用戶點擊了歡迎屏幕之后,我想顯示另一個可以在人像模式和橫向模式下使用的屏幕。

我已經設置了一個實現一個視圖控制器shouldAutorotateToInterfaceOrientation:返回YESUIInterfaceOrientationPortrait ,和我的視圖添加到與窗口[window addSubView:view] 我將此視圖標記為1

當用戶在歡迎視圖中點擊並應用程序移至新視圖時,我將執行以下操作:

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

其中myViewController是第二個視圖的視圖控制器的實例(可正確處理shouldAutorotateToInterfceOrientation方法)。

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

蘋果公司的這份說明說,只有一個視圖控制器將獲得輪換通知。 但是,我已經刪除了另一個視圖控制器。

我究竟做錯了什么?

實際上,該注釋並不是說“只有一個視圖控制器會收到通知”,而是說“只有添加到UIWindow的第一個視圖控制器才會旋轉”。 所以這可能是問題所在。

要解決此問題,我想說的是始終將一個視圖添加到您的窗口(稱為永久視圖),並將您的歡迎屏幕和下一個視圖添加到該永久視圖。

希望這可以幫助。

作為您鏈接到狀態的注釋:

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

因此,請放置一個標志,以確保在用戶關閉屏幕之前,應該應該AutorotateToInterfceOrientation返回NO,然后再返回YES。 這是一個簡單且可行的解決方案-但是,從代碼可讀性的角度來看,“ dismissed”視圖實際上控制旋轉可能會造成混淆。

親身; 我的經驗是,旋轉某些視圖而不旋轉某些視圖並不是真正值得的,並且用戶往往不喜歡它。

快樂編碼

我寫了一個快速測試,顯示您要嘗試執行的操作。 這是我所做的基本操作:

創建兩個視圖控制器。 App首先通過NIB文件在AppDelegate中將第一個視圖控制器設置為實例變量viewController。 然后將其添加到您編寫的窗口中。

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

使用[self.viewController removeFromSuperview]刪除視圖。 這與標記的處理方式不同。

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

像您指定的那樣添加到窗口中。

不確定您的代碼有什么不正確。 我想也許第一個視圖並沒有真正被刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM