2016-07-05 28 views
1

我想在兩個視圖控制器之間切換。兩個ViewController都從CenterViewController繼承。下面的代碼是一個視圖控制器(CertificatenViewController)添加到堆棧:替換ViewController

centerViewController = CertificatenViewController(nibName: "CertificatenViewController", bundle: nil) 
    centerViewController.delegate = self 
centerNavigationController = UINavigationController(rootViewController: centerViewController) 
    view.addSubview(centerNavigationController.view) 
    addChildViewController(centerNavigationController) 

    centerNavigationController.didMoveToParentViewController(self) 

這發生在viewDidLoad中,並在同一個班我有一個switch語句來檢查哪些視圖必須加載,這樣的事情:

 switch menuItem.getNibname() { 
    case "CertificatenViewController": 
     print(menuItem.getNibname()) 

     centerViewController = CertificatenViewController(nibName: menuItem.getNibname(), bundle: nil) 
     centerViewController.delegate = self 

    case "SettingsViewController": 
     print(menuItem.getNibname()) 

     centerViewController = SettingsViewController(nibName: menuItem.getNibname(), bundle: nil) 
     centerViewController.delegate = self  

    default: break 

    } 

我不知道到底是什麼問題,但它似乎是視圖沒有重新加載。我試過popViewControllerAnimated但這不起作用。也許你可以幫我解決這個問題。

解決方案:

func changeView(menuItem: MenuItem){ 

    self.centerNavigationController.viewControllers.removeAll() 


    switch menuItem.getNibname() { 
    case "CertificatenViewController": 
     print(menuItem.getNibname()) 

     self.centerNavigationController.pushViewController(self.centerViewController, animated: false) 

    case "SettingsViewController": 
     print(menuItem.getNibname()) 

     self.centerNavigationController.pushViewController(self.settingsViewController, animated: false) 

    case "MessagesViewController": 
     print(menuItem.getNibname()) 

     self.centerNavigationController.pushViewController(self.messagesViewController, animated: false) 

    default: break 

    } 

} 
+0

你是指兩個View Controller之間**改變**的含義是什麼?如果你的意思是推或模態地呈現下一個視圖控制器,你所做的是不正確的。下面的答案向您展示瞭如何呈現視圖控制器。 –

回答

2

通常,這不是呈現視圖控制器的方式:

view.addSubview(centerNavigationController.view) 
addChildViewController(centerNavigationController) 

centerNavigationController.didMoveToParentViewController(self) 

只是刪除該代碼。

我不知道正是你正在嘗試做的,但類似

self.presentViewController(centerNavigationController, animated: true, complettion: nil) 

是典型的。這使得當前視圖控制器顯示導航控制器(通常僅在其本身之上)。然後導航控制器會顯示你自己設置的根目錄(所以centerViewController)。

當您想擺脫它時,您可以在執行展示的視圖控制器實例上調用dismissViewControllerAnimated:completion:。它駁回了導航控制器(不叫開除導航控制器)

以後,當您想更換,你這樣做:

centerViewController = CertificatenViewController(nibName: menuItem.getNibname(), bundle: nil) 
    centerViewController.delegate = self 

地址:

centerNavigationController.setViewControllers([centerViewController], animated: true) 
0

@Lou佛朗哥

謝謝你的回答!請不要留意重複的代碼,我稍後將刪除它。這是我目前的解決方案:

override func viewDidLoad() { 
    super.viewDidLoad() 

    centerViewController = CertificatenViewController(nibName: "CertificatenViewController", bundle: nil) 
    centerViewController.delegate = self 

    // wrap the centerViewController in a navigation controller, so we can push views to it 
    // and display bar button items in the navigation bar 
    centerNavigationController = UINavigationController(rootViewController: centerViewController) 

    self.presentViewController(centerNavigationController, animated: true, completion: nil) 

    let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(ContainerViewController.handlePanGesture(_:))) 
    centerNavigationController.view.addGestureRecognizer(panGestureRecognizer) 

} 

func changeView(menuItem: MenuItem){ 


    switch menuItem.getNibname() { 
    case "CertificatenViewController": 
     print(menuItem.getNibname()) 

     centerViewController = CertificatenViewController(nibName: menuItem.getNibname(), bundle: nil) 
     centerViewController.delegate = self 

     // wrap the centerViewController in a navigation controller, so we can push views to it 
     // and display bar button items in the navigation bar 
     centerNavigationController = UINavigationController(rootViewController: centerViewController) 

     centerNavigationController.setViewControllers([centerViewController], animated: true) 
     self.presentViewController(centerNavigationController, animated: true, completion: nil) 

     let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(ContainerViewController.handlePanGesture(_:))) 
     centerNavigationController.view.addGestureRecognizer(panGestureRecognizer) 


    case "SettingsViewController": 
     print(menuItem.getNibname()) 

     centerViewController = SettingsViewController(nibName: menuItem.getNibname(), bundle: nil) 
     centerViewController.delegate = self 

     // wrap the centerViewController in a navigation controller, so we can push views to it 
     // and display bar button items in the navigation bar 
     centerNavigationController = UINavigationController(rootViewController: centerViewController) 

     centerNavigationController.setViewControllers([centerViewController], animated: true) 
     self.presentViewController(centerNavigationController, animated: true, completion: nil) 


     let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(ContainerViewController.handlePanGesture(_:))) 
     centerNavigationController.view.addGestureRecognizer(panGestureRecognizer) 

    default: break 

    } 
} 

但我現在得到以下錯誤和黑屏。

Certificaten365[4108:1731299] Warning: Attempt to present <UINavigationController: 0x130014000> on 
<Certificaten365.ContainerViewController: 0x12fe3dde0> whose view is not in the window hierarchy! 
+0

不要做出不是解決方案的答案 - 相反,編輯您的問題以獲得更新的信息。 –

+0

您正在展示一個當前不在屏幕上的視圖控制器(這就是錯誤的含義)。看看我的答案 - 它說保持相同的centernavigator並重置其viewControllers。如果你想要一個新的,你需要先關閉當前的導航控制器。 –

+0

對不起,你知道的新的stackoverflow ..嘿嘿。我按照你的建議更新了我的第二個答案(只有viewDidLoad)。但是我得到了同樣的錯誤:警告:嘗試呈現..其視圖不在視圖層次結構中! – KNV