iOS的执行了VC执行了popToRootViewControllerAnimated之后再直接执行VC.tabBarController.selectedIndex不管用解读

前言

今天我在使用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隐藏了,保证不隐藏。这样就可以解决问题。

你可能感兴趣的:(Object-iOS)