[self.navigationController pushViewController:nextController animated:NO];
一般情况下push控制器没什么问题,关键在于,在nextController控制器中有一个动作执行需要较长时间。
这个耗时的方法分别放在viewDidLoad、viewDidAppear里面,tableview可能会卡顿。
原因:nextController执行完viewWillLoad、viewDidLoad、viewWillAppear、viewDidAppear、viewWillLayoutSubviews、viewDidLayoutSubviews之后,页面才会跳转。
更深层次的原因是:因为UIViewController之间的push是以栈的方式实现的,说白了push到下一个controller,其实就是新的controller在上面遮住了旧的controller,那么问题就来了,有这样的需求,刚开始请求网络的时候要求隐藏整个view,等到网络回来的时候再显示,那么会出现所谓的“残影”现象(残留上个页面,过会才消失),其实是推过去的了,只是透明,没遮住旧的controller而已(至于为什么刚开始并不是隐藏UIviewController的self.view,它却是透明,这个问题有待研究)。
既然知道问题的所在了,解决起来就很清晰了,
在跳转之前,(或者直接在要跳转的UIViewController里设)把新controller的view的背景色设为白色
由于实际上新controller的view是在loadView方法中才创建的,所以没有影响,改变的只是默认view的背景色,新的view依然可以自由设置背景色
AddShopViewController *controller = [[AddShopViewController alloc] init];
controller.view.backgroundColor = [UIColor whiteColor];// 设置背景色为白色,消除残影
[self.navigationController pushViewController:controller animated:YES];
另外个人觉得因为viewWillLoad等等导致的延时其实影响并不是很大,若
为了提升用户体验,追求极致,那么让耗时操作异步执行就可以了。
此外:
在tableview的didSelectRowAtIndexPath:方法中有push控制器