簡體   English   中英

在標簽欄中彈出導航控制器

[英]Popping a navigation controller in a tab bar

我有一個帶有幾個標簽欄按鈕的標簽欄MainViewController ,第一個是View 1 ,它是一個導航控制器,最多可堆疊3或4個孩子。 最后一個選項卡欄按鈕是SettingsViewController ,其內部具有類似於“注銷”的功能,該函數在AppDelegate上調用一個方法,該方法刪除MainViewController並將用戶發送回登錄頁面。

當按下SettingsViewController上的注銷按鈕時,我希望AppDelegate將選定的選項卡設置為View 1 (已完成),將用戶送回到登錄視圖(也已完成),但也將用戶送回到View 1上的popToRootViewController我正在努力。

我試過使用tabBar上的viewControllers屬性來獲取對索引為0的視圖控制器的引用,但這似乎不是正確的方法,除非我沒有正確實現它。

我最近的嘗試:

// Fine
mainViewcontroller.tabBarController.selectedIndex = 0;

// Not so fine
NSArray *allViewControllers = [mainViewcontroller.tabBarController viewControllers];
View1 *vc = [allViewControllers objectAtIndex:0];
[vc.navigationController popToRootViewControllerAnimated:NO];

另一種嘗試僅遍歷選項卡中的所有視圖控制器並彈出到根目錄的嘗試,這似乎也不起作用:

for (UIViewController *viewController in mainViewcontroller.tabBarController.viewControllers)
{
    [viewController.navigationController popToRootViewControllerAnimated:NO];
}

有人可以幫忙嗎?

您是否考慮過要從中彈出的視圖控制器甚至不存在,因為它可能已(暫時)從內存中清除了? 如果內存不足,則可以從系統中刪除選項卡中不可見的View Controller。

為了克服這個問題,我將在設置selectedIndex時停止當前方法。 但是,我以前會設置一個標志來聲明該應用程序應彈出回到根目錄,即Bool shouldPopBackToRoot = true;

然后在viewControllers的viewDidAppear中檢查此標志以查看它們是否應該popBackToRoot,如果是,則從viewController的viewDidAppear中獲取popToRootViewController(並且不要忘記將shouldPopBackToRoot重置為false)。

只是為了閉包起見...使用我在問題中粘貼的完全相同的代碼,當我以編程方式而不是在IB中重新創建選項卡欄控制器時,可以找到該代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM