我有一个带有几个标签栏按钮的标签栏MainViewController
,第一个是View 1
,它是一个导航控制器,最多可堆叠3或4个孩子。最后一个标签栏按钮是SettingsViewController
,其中有一个类似于“Logout”的功能,它调用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];
}
有人可以帮忙吗?
答案 0 :(得分:0)
您是否认为您尝试弹出的视图控制器可能甚至不存在,因为它可能已从内存中清除(暂时)?如果内存不足,系统可以从内存中删除不可见选项卡中的视图控制器。
为了解决这个问题,我会在设置selectedIndex时停止当前的方法。但是,我之前已经设置了一个标志,表明应用程序应该弹回root,即Bool shouldPopBackToRoot = true;
然后在viewControllers的viewDidAppear中检查这个标志,看看它们是否应该是popBackToRoot,如果是的话,请查看viewController的viewDidAppear中的popToRootViewController(并且不要忘记将shouldPopBackToRoot重置为false)。
答案 1 :(得分:0)
只是为了关闭...使用我在我的问题中粘贴的完全相同的代码,当我以编程方式而不是IB重新创建标签栏控制器时找到了。