1

這是我的問題。 我有一個基於視圖的應用程序。 我向AppDelegate添加了NavigationController,如下所示。IOS。導航控制器。重用ViewControllers

UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:_viewController];  
navigationController = [nvc retain]; 
[nvc retain];  
[self.window addSubview:navigationController.view]; 

這段代碼是我從網上獲得的。我不知道這是否正確。

在所有的viewControllers我做以下推新視圖。

UIViewController *newViewController = [[NewViewController alloc] init]; 
[self.navigationController pushViewController:newViewController animated:TRUE]; 
  1. 我不知道爲什麼self.navigationController不會在推視圖返回零。它以某種方式使用AppDelegate導航控制器?

  2. 如果我想重用一些視圖控制器。我的意思是每次我想調用視圖控制器時都不會分配init。我怎樣才能做到這一點?在AppDelegate中儲存參考?其他解決方案?

  3. 我有一個複雜的導航。即A,B,C是視圖控制器。 A呼叫B. B呼叫C. C呼叫A.如果我一直呼叫,我每次都創建一個新的視圖控制器。我該如何重用這些視圖控制器(或者在調用新視圖時彈出並釋放視圖)?

謝謝。

回答

0

1)navigationControllerUIViewController的財產。如果視圖控制器是導航控制器層次結構的一部分,那麼它將被設置。

2)你必須自己管理它。在推動視圖控制器的對象中存儲引用是實現此目的的常用方法。因此,如果A推B,則A存儲對B的引用等。

3)沒有辦法讓UINavigationController爲您做到這一點。從你想要做什麼我假設你來自Android背景? Android有具體的方法來做到這一點,但在iOS中,你必須自己編寫代碼。您可以通過查看UINavigationControllerDelegate及其navigationController:didShowViewController:animated:方法來完成此操作。您可以看到視圖控制器何時被推入,以及它是否已經在堆棧中,然後更新導航堆棧(即UINavigationControllerviewControllers屬性),將其從原來的位置刪除。但是這可能會讓用戶感到困惑。

+1

也許答案是不使用NavigationController。有沒有辦法推動一個新的視圖控制器而不使用它? 也許只是推送一個新的視圖控制器,而不添加到任何堆棧解決了我的問題。你怎麼看? – Tony 2011-12-21 13:44:10

+0

這完全取決於你希望用戶如何與你的應用進行交互。你也可以通過使用'presentModalViewController:animated:'來顯示一個新的視圖控制器,它將使新的視圖控制器模態在當前UI的頂部。 – mattjgalloway 2011-12-21 13:49:04

+0

馬特, 想象一下,我有viewcontroller A,B和C. A是基礎的。 A可以去B,B可以去C,C可以去B. B或C可以返回A.像這樣:A-> B,B <-> C,C-> A,B-> A。 我可以在A,推B中有一個導航控制器,當B調用C推C並同時在A的導航控制器中彈出B? 所以我有以下內容: - A調用B。導航控制器堆棧:A,B - B調用C.導航控制器堆棧:A,C - C調用B。導航控制器堆棧:A,B - B返回到A.導航控制器堆棧:A 這是正確的嗎?如何在呼叫另一個視頻後彈出視圖? – Tony 2011-12-21 13:56:15