2015-09-11 82 views
1

我想知道如何正確使用NavigationController,每個我把它稱爲例如不及時實例化視圖控制器的應用程序導航:導航與NavigationViewController

在所有知道的應用程序,如Instagram的,當你點擊在一個工具欄項目上,你訪問一個viewController,但是這個狀態被保存,如果你在一張照片上,它仍然是這張照片後,你去設置,張貼照片等。在我的應用程序,我的NavigationController實例化每次我想訪問它時都會有一個新的ViewController,例如,當你在ViewDidLoad中加載數據時,這是耗時的。

有人可以幫助我嗎?

+0

您可能正在尋找[UITabBarController](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITabBarController_Class/) –

+0

你是對的。 – Benobab

回答

1

如果你不想創建一個新的控制器 - 不要創建它!

創建您的控制器一次,然後重新使用它們。例如,你可以聲明你的控制器作爲一個單身:

let vc1 = MyViewController1() 
let vc2 = MyViewController1() 
let vc3 = MyViewController1() 

而當你需要推動一些控制器不創建一個新的,但重複使用已經創建:

navigationVC.pushViewController(vc2, animated: true) 

的UINavigationController將拋出,如果出現錯誤您將嘗試推送已在導航堆棧中的控制器。所以,你必須從導航堆棧首先除去它:

// vc2 - is a controller that could be in the navigation stack and should be pushed once more 
var controllers = navigationVC.viewControllers 
if let index = controllers.indexOf(vc2){ 
    controllers.removeAtIndex(index) 
} 
navigationVC.setViewControllers(controllers, animated: false) 

那麼你可以把vc2如常。如果在您的應用程序中可能,您還應該檢查一個案例,如果vc2應該在vc2之後立即執行。

+0

在這種情況下,我有這個錯誤:不支持多次推送相同的視圖控制器實例 – Benobab

+0

你想在導航堆棧中擁有少量相同的控制器嗎? – Avt

+0

我想一次又一次地調用我現有的viewController來保存這個狀態,在其中的一箇中,我正在完成一個字段,我想要這個字段與我在裏面寫的內容,下一次我叫它,是它可能嗎? – Benobab