2017-08-22 53 views
-1

我有一個很好的UINavigationController。每個視圖控制器都有自己的按鈕,可以將堆棧彈回到其根目錄,這也非常棒。不過,我也想通過按下標籤欄上的按鈕(顯然是在導航堆棧外的完全不同的類中)將堆棧彈回到其根目錄。UINavigationController popToRootViewController方法不能由委託調用嗎?

因此,我在標籤欄類中創建了一個委託,該委託在堆棧頂部找到視圖控制器,並調用該視圖控制器中的方法將堆棧彈回到根目錄。我向控制檯打印了一些內容,以驗證委託設置是否正確。一切正常,因爲它應該,除了按下標籤欄不會彈出回到其根。

想法?

這是在一個UINavigationController堆

class BlankViewController202: UIViewController, MainContainerViewControllerDelegate { 

    // pop to root 
    func popToRoot() { 
     self.navigationController?.popToRootViewController(animated: true) 
     print("success") 
    } 

} 

的頂視圖控制器當此功能上面從該視圖控制器中調用(當用戶按下視圖控制器本身上的按鈕),它彈出堆棧。但是當這個相同的確切方法被標籤欄中的委託調用時,它不會彈出堆棧(但它會打印到控制檯,所以我知道它正確地連接起來)。

這是其中按鈕位於標籤欄的是,當按下應該彈出棧返回到其根

protocol MainContainerViewControllerDelegate { 
    func popToRoot() 
} 

class MainContainerViewController: UIViewController { 

    func moveToTab3(sender: UIButton!) { 
     // ... 
     let banana = BlankViewController202() 
     self.delegate = banana 
     delegate?.popToRoot() 
    } 

} 
+0

因此......你有一個TabBarController ......其中一個Tabs包含一個NavigationController ......當你點擊第三個Tab時,你想讓NavController(如果它是當前選項卡?)彈出到其根目錄,並且你想要顯示第三個標籤......這聽起來是對的嗎? – DonMag

回答

1

的問題是,BlankViewController202()使得一個全新的,獨立的BlankViewController202 - 它是而不是已作爲導航控制器界面的一部分的特定BlankViewController202。 您想與之對話的BlankViewController202。

+0

(1)該副本是否可供我通過代理進行調用? (2)是否有任何其他方式彈出到精確視圖控制器之外的導航堆棧的根目錄? –

0

只要遵循一些步驟

1)使UINavigationViewController一個對象AppDelegate,您可以用應用程序委託的共享對象訪問。

2)moveToTab3的第一行會[Appdelegate sharedObject].navigationViewControllerVariable = self.navigationViewController

3)在你的委託方法在此線

[[Appdelegate sharedObject].navigationViewControllerVariable popToRootViewController:true] 

這肯定會工作:)

+0

該應用程序有很多導航控制器,其中有很深的堆棧,並且在那裏使用單例的想法聽起來不像一個可靠的計劃。 –

0

我想,你委託錯誤模式。您可以再次看到模型委託使用協議。如果使用協議,則刪除行代碼「let banana = BlankViewController202()」。