1. 程式人生 > >iOS中TabBar顯示模式VC時切換TabItem的奇怪行為

iOS中TabBar顯示模式VC時切換TabItem的奇怪行為

本貓App的UI層次大致如下:

  • TabBarVC
    • NavVC
      • 若干子VC
    • NavVC
      • 若干子VC
    • NavVC
      • 若干子VC
    • NavVC
      • 若干子VC
    • NavVC
      • 若干子VC

各個VC之間切換都很正常,但最近測試時偶然發現在VC0中的某個子VC裡,呼叫present顯示模態VC時,出現自動切換TabItem的行為:

第二次彈出VC後,TabBarVC當前顯示的VC出現黑屏。

這個現象很怪異,簡單搜了一下,基本沒有人遇到同樣的情況。所以可以排除iOS系統BUG的原因,應該是自己程式碼哪裡有問題。

使用git回退到上一版本,發現無此問題!!!用git diff比較版本差異,發現如下方法有所區別:

override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        
        enterLayoutTimes += 1
        if enterLayoutTimes == 2{
            //需要將TabBar背景圖片放到layout例程裡來設定,在didLoad中不會有效
            self.tabBar.backgroundImage = UIImage(named: "background_dark")
            //2.第二次進入:然後再切換回第一個VC,這樣做的目的是使得ESTabBarController中初始選擇不會"僵住"
            self.selectedIndex = 0
            //3.遞增enterLayoutTimes變數,使其大於2,可以開始自定義轉場動畫的顯示了。
            enterLayoutTimes += 1
        }else{
            //1.第一次進入:需要首先選擇TabBar的第二個VC
            self.selectedIndex = 1
        }
}

注意其中註釋line 1,應該是will layout未準備充分時就切換了TabBarVC。

我們將第一次選擇VC的時機放到will appear中:

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
                
        self.selectedIndex = 1
    }

這樣就解決了本博所述的問題。

有人可能奇怪,為毛要大費周章在TabBarVC初始化時反覆切換VC?這是因為我使用了第三方的ESTabBarController類,該類在作為根VC時,如果不在初始化中做這樣一個切換,則其在TabBar中Item的動畫圖示行為就會不正常。

that’s why!