2016-11-28 149 views
1

從應用程序委託視圖到視圖控制器的正確方法是什麼?當我收到推送通知時,我正在將用戶轉換爲視圖控制器,但視圖不完整。導航欄看起來不正確。這裏是我的設置:繼續從appdelegate到視圖控制器

tabviewcontroller (storyboard name is 'main') 
- nav1controller -> view1controller -? view1detailcontroller (storyboard name is 'view1detail') 
- nav2controller -> ... 

當推送通知到達時,我想讓用戶訪問veiw1detailcontroller。我想讓用戶回到view1controller。

這是我的代碼:

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let mainViewController = storyboard.instantiateViewControllerWithIdentifier("main") as! UIViewController 

let view1detailcontroller = storyboard.instantiateViewControllerWithIdentifier("view1detail") as! view1detailcontroller 

let nav = UINavigationController(rootViewController: mainViewController) 
nav.pushViewController(view1detailcontroller, animated: true) 
self.window!.rootViewController = nav 

所以,過渡罰款view1detailcontroller。但是,一旦我回到view1controller,那個屏幕和所有其他屏幕上的導航欄就會顯示「main」,並且所有導航項目也都會丟失。

我在做什麼錯?

+0

這是什麼'nav.pushViewController(view1detailcontroller,animated:true)' –

+0

我需要轉換到view1detailcontroller – Prabhu

回答

1

通過創建一個新的導航控制器,並設置self.window!.rootViewController = nav,你基本上重置整個視圖棧。 (例如,您將丟失在您的第一個視圖層次結構報價中提到的tabviewcontroller

而是訪問現有的選項卡視圖控制器,並且它是子導航控制器以推送您的新視圖控制器。如果您需要更多幫助來完成這項工作,您需要分享更多代碼/故事板屏幕截圖,以瞭解您現有的設置。

編輯

從您的意見,似乎(雖然不是很清楚),你self.wondow.rootViewController已經是你的「tabBarController」包含導航控制器。假設這一點,你知道tabbarcontroller在您預期的導航控制器的索引,你可以做以下同層次

  1. 打開你的意圖視圖控制器在收到推送通知的訪問tabBaController:

    如果讓tabBarController = self.window.rootViewController as?的UITabBarController

  2. 訪問標籤欄控制器內導航控制器:(代碼假定打算導航控制器是第一選項卡根據您的設置在代碼更改索引。)

    如果讓navController = tabBarController.viewControllers [0]如?的UITabBarController

  3. 創建此導航控制器上要所有的視圖控制器的陣列,並且使用setViewControllers方法設置它們:

    VAR viewControllersArray:[UIViewController中] = UIViewController中; viewControllersArray.append(view1controller) viewControllersArray.append(view1detailcontroller) navController.setViewControllers(viewControllers:viewControllersArray,動畫:真)

  4. 這裏,實例化view1controllerview1detailcontroller,你在你的代碼形式的故事板做,注意以下幾點形式setViewControllers documentation

的最後一個項目添加到數組成爲 導航堆棧

的頂部項目
+0

謝謝。我如何訪問tabview控制器的導航控制器?我有我的tabview控制器是這樣的:var mainViewController = storyboard.instantiateViewControllerWithIdentifier(「main」)as UIViewController self.window?.rootViewController = mainViewController – Prabhu

+0

等等!在這個問題中,你的代碼提到了'main'作爲你想要推送的view controller的storyboard標識符,並且在這個評論中你說它是你的tabviewcontroller的標識符。哪一個? – lukya

+0

我的故事板中標籤viewcontoller的名稱是'main'。它有一個導航控制器,它有兩個視圖控制器(view1controller和view1detailcontroller)。基本上,我希望用戶去view1detailcontroller,同時保持後退按鈕和標籤。 – Prabhu

0

而不是直接從主故事板中推送視圖控制器,你應該得到topViewController或visibleController並在topController上推動所需的viewController,以便它將保持你的視圖控制器的堆棧,你會得到你想要的。

+0

請問您能幫我解決一些代碼嗎?我是新來的迅速。謝謝! – Prabhu

+0

我可以寫一個算法,你應該怎麼做 – devjangir

+0

我可以寫一個算法,你應該怎麼做,就像先獲取窗口rootviewcontroller一定是你的navigationController,然後在UINavigationController上獲取topController,如果這是detailViewController然後使用這個並推送你的數據,否則遍歷UINavigationController的堆棧控制器的所有控制器並獲取detailController的對象,並使用此VC來推送您的代碼。 – devjangir

0

您可以使用此:

var rootViewController = self.window!.rootViewController as UINavigationController 
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
    var viewController = mainStoryboard.instantiateViewControllerWithIdentifier("view") as ViewController 
    rootViewController.pushToViewController(viewController, animated: true) 
+0

問題在於它不保留我的標籤視圖和導航堆棧。 – Prabhu

+0

您可以在下一個視圖控制器中設置:覆蓋func viewWillAppear(動畫:布爾){ super.viewWillAppear(動畫) self.navigationController?.setNavigationBarHidden(true,animated:animated) } – User511

相關問題