问题:
iOS7 相比iOS8及以后,在页面进入或者退出的时候,有一定延迟
比如push到子页面的时候,如果viewwillappear 还没有完成,就直接再进入下一个页面,就会crash
场景1:
举例场景:用户查看自己的地址列表时,如果地址列表为空,产品希望我们APP自动跳转到新建地址的页面
这个常规的做法是在viewdidload里面request address list,在response里面,判断如果空的话,push到新建address的页面
做出来,iOS8.9都ok,但是在iOS7上就会直接crash
类似很多场景(push/pop操作未完成,就继续push/pop),如果大家crash,能看到“Can't add self as subview”
类似这种,就是其中之一的场景。
解决方案:
这种的主流解决方案是:在viewwillappear的时候再执行相关动作。
我这边自己用过的一个方式是使用了个开源库:UIViewController+APSafeTransition
插一段代码,其实就是建了个父类在所有pop或者push的接口做了统一处理
问题:
A->B, Apush 到B,但实际页面还是A,但是导航左上角是个返回按钮(push后自带的返回上一页的backButton),然后整个页面点击无任何响应.
场景2:
使用了tabbrviewcontroller, 有4个tab(tabA,tabB .... tabD)
然后从2个tab,进入了子页面N多层,最后来到页面M,然后点击M页面的提交button后,希望回到第2个界面B。
需要达到的效果是,也可能从任何一个tab进入页面M,但都需要进入界面B
实现方式:
[self.navigationController popToRootViewControllerAnimated:NO];
然后发个通知,让tabbarViewController设置select为tabB,然后pushViewController到界面B
解决方案:
可能很多童鞋都没看懂,我说了什么,总结下就是popToRootViewController之后,在rooview还没出现viewappear的时候,执行pushViewController,操作,iOS7会出现页面错乱
但是这个又和上一个问题不太一样,因为之前已经使用了SafeTransition,不应该出这种问题的。
后来想了下,这个是appdelegate接受Notification 的,而Notification无法保证在主线程(理论上来说,Notification是线程安全的,同时post 和receive是在一个线程里面,但是在这里出了错误,说明的确有问题),于是在pushviewcontroller的地方增加为主线程,于是问题解决。
备注:这个没有更新完,待补充,具体我需要查看下实际所在的线程,确认在iOS7上的情况,但目前的解决方案是如此。谨记之
dispatch_async(dispatch_get_main_queue(), ^{
[currentViewController PushViewController:viewController animation:animation];
});