How to present view controller properly?

丶灬走出姿态 提交于 2020-01-06 02:16:05

问题


I have a pretty simple application with a couple of UIViewControllers (say VC_A and VC_B). Every screen has a button that allows to switch to another screen (no UINavigation is used).

App schedules a local notification, which, when expired, should present another view controller (VC_N - no matter what screen is active at the moment).

The problem is that sometimes application throws:

'NSInternalInconsistencyException', reason: 'Attempting to begin a modal transition from  
<VC_A: 0x2021e0> to <VC_N: 0xf84b970> while a transition is already in progress. 

Wait for viewDidAppear/viewDidDisappear to know the current transition has completed'

What is the proper way to implement such behaviour?


回答1:


A. Use UIViewController's new presentViewController:animated:completion to present all three controllers instead of the old modal method.

B. Create a Boolean flag and initialize it to NO.

C. Before any view controller presentation, check for this flag. If YES, set to NO. And then present the VC. In the completion block, set the flag to YES again.

D. The app should ignore this flag when present the initial view controller whether VC_A or VC_B.

One pitfall to this is that if a button got pressed or the local notification expired while already a view controller was in a transition state, then the new VC won't get presented. One can improve upon this logic to present it after if needed.




回答2:


When the timer expires don't call the view presentation in that timer handler method. Instead try putting the view presentation call in a separate method and use [self performSelector: withObject: afterDelay:] to call that method (delay could be 0.1]. This should get the view presentation done when current transitions complete.



来源:https://stackoverflow.com/questions/16117977/how-to-present-view-controller-properly

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!