今天我在使用VC.tabBarController.selectedIndex
的时候出现了这个问题,我首先用导航控制器跳转了很多个界面,然后想直接回到根控制器tabBarController
的其他的控制器上,也就是执行VC.tabBarController.selectedIndex = 1
这样的操作,可以直接操作的呀,当然肯定行了,会有个问题就是你再点击之前的那个标签控制器的话,还是显示之前那个界面并没有回到首页。所以我的打算就是先回到导航控制器的根控制器的,然后再切换根控制器。
[viewVC.navigationController popToRootViewControllerAnimated:NO];
viewVC.tabBarController.selectedIndex = 1;
我这样写的看上去很正常的,但是结果就是只执行了pop的方法,但是下面虽然也执行了,但是并没有作用,标签控制器并没有切换,只是回到根控制器了。后来尝试让他们切换一下前后位置,很奇怪的事居然可以行的通了,都执行了,切回来的时候而且之前也回到首页了。
其实,我之后分析一下,就可以很明白的看出来什么原因,我们可以看到执行[viewVC.navigationController popToRootViewControllerAnimated:NO];
之后,这个操作是把栈上面的数据都清空,只保留栈底的数据,所以viewVC被推出栈的时候,也就释放了ViewVC变为nil,这个时候执行了,viewVC.tabBarController.selectedIndex肯定不起作用了呀,viewVC = nil
。我们再来看一下先执行viewVC.tabBarController.selectedIndex
再执行popToRootViewControllerAnimated
方法时候,我们知道tabBarController标签控制器的的子控制器navigationController是不会被释放的,除非程序kill或者crash才会被释放,所以我们先执行viewVC.tabBarController.selectedIndex
时,在执行了之后ViewVC还是在navigationController的栈中,没有被释放,所以再执行popToRootViewControllerAnimated也是行的通的。
viewVC.tabBarController.selectedIndex = 1;
viewVC.tabBarController.tabBar.hidden = NO;
if (![viewVC isEqual:focusNav.viewControllers.firstObject]) {
[viewVC.navigationController popToRootViewControllerAnimated:NO];
}
之所以viewVC.tabBarController.tabBar.hidden = NO;
这句代码,防止tabbar隐藏了,保证不隐藏。这样就可以解决问题。