2010-03-23 73 views
2

我相信這是一個簡單的問題,但現在已經逃脫了一段時間。是什麼導致UIViewController變爲活動狀態?

說我有一個UIViewController,或者定義爲XIB或堆棧中的根。在我的代碼中,我想用另一個視圖控制器替換它。只是把它取而代之。我會怎麼做?

我已經嘗試過定義控制器和分配,但不知道實際上是什麼讓它在沒有導航控制器的情況下在屏幕上推動。

+0

我剛剛找到了答案,比我想象的要簡單: 只需將self.view替換爲新的視圖控制器視圖即可。 – 2010-03-23 07:11:45

回答

1

我想當你說你想替換視圖控制器時,你的意思是你想替換視圖。請記住,視圖控制器不可見,但每個視圖控制器都映射到視圖,通過將視圖添加爲可見視圖的子視圖,視圖可以變爲可見。

您用新視圖控制器視圖替換self.view的解決方案可能適用於您的特定情況,但它可能不是您的問題的「正確」答案。將有這種解決方案不適合你的情況。

假設您有一個簡單的基於視圖的應用程序,沒有導航控制器,也沒有標籤欄控制器。在您的應用程序委託中構建YourFirstViewController的實例,並調用[window addSubview:yourFirstController] ;.您的視圖層次結構現在由一個帶有單個子視圖的UIWindow組成 - YourFirstViewController的視圖。

現在我們假設用戶按下該視圖上的按鈕,該按鈕由YourFirstViewController中定義的IBAction處理。您想通過使用與YourSecondViewController關聯的視圖「替換」YourFirstViewController的視圖來做出響應。我把引用中的「替換」放在引號中,因爲我們更常用的方式是將其視圖控制器推到導航堆棧上,或者調用presentModalViewController:animated:以模態方式呈現視圖,但假設您由於某種原因拒絕了這些選項,並且實際上您想用YourSecondViewController的視圖手動替換YourFirstViewController的視圖。

這是操縱視圖層次結構的一個簡單問題。你想從它的超級視圖(在這種情況下是UIWindow)中刪除YourFirstViewController的視圖,並且想要將YourSecondViewController的視圖添加爲子視圖來替換它。因此,你的行動將是這個樣子:

- (IBAction)replaceButtonClicked { 
    UIView *mySuperview = self.view.superview; 
    YourSecondViewController *secondController = [[YourSecondViewController alloc] init]; 
    [mySuperview addSubview:secondController.view]; 
    [self.view removeFromSuperview]; 
    [secondController release]; 
} 

當我們使用一個方法,如-pushViewController:動畫:或-presentModalViewController,接收控制器操縱視圖層次我們。這可能使我們看起來像在屏幕上查看控制器,但我們不是。我們只是在查看嵌套視圖的大層次結構,一直到頂層的UIWindow。

0

你可以提出一個新的視圖控制器modally

[self presentModalViewController:aViewController animated:YES]; 

這不會完全取代當前的VC,但它會顯示在當前視圖的新視圖。

相關問題