[iOS][兼容性]iOS7 pushViewController,popViewControllerAnimated存在的问题



问题:

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];

});

推荐阅读更多精彩内容