如何正确呈现视图控制器?

时间:2013-04-20 07:41:48

标签: ios uiviewcontroller presentmodalviewcontroller nsexception

我有一个非常简单的应用程序,有几个UIViewControllers(例如 VC_A VC_B )。每个屏幕都有一个允许切换到另一个屏幕的按钮(不使用UINavigation)。

应用程序安排本地通知,当过期时,应显示另一个视图控制器( VC_N - 无论此时哪个屏幕处于活动状态)。

问题是有时应用程序抛出:

'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'

实施此类行为的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

一个。使用UIViewController的新presentViewController:animated:completion来呈现所有三个控制器而不是旧的模态方法。

B中。创建一个布尔标志并将其初始化为NO。

℃。在任何视图控制器演示之前,请检查此标志。如果是,则设置为NO。然后呈现VC。在完成块中,再次将标志设置为YES。

d。当提供初始视图控制器VC_A或VC_B时,应用程序应忽略此标志。

这样做的一个缺陷是,如果在视图控制器处于过渡状态时按下按钮或本地通知已过期,则新VC将不会显示。如果需要,可以改进这种逻辑来呈现它。

答案 1 :(得分:0)

当计时器到期时,不要在该计时器处理程序方法中调用视图表示。而是尝试将视图表示调用放在一个单独的方法中,并使用[self performSelector:withObject:afterDelay:]来调用该方法(延迟可能为0.1)。这应该在当前转换完成时完成视图显示。