前言
今天我在使用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隱藏了,保證不隱藏。這樣就可以解決問題。