本猫App的UI层次大致如下:
-
TabBarVC
-
NavVC
- 若干子VC
-
NavVC
- 若干子VC
-
NavVC
- 若干子VC
-
NavVC
- 若干子VC
-
NavVC
- 若干子VC
-
NavVC
各个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! ?