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

Posted

技术标签:

【中文标题】如何正确呈现视图控制器?【英文标题】:How to present view controller properly? 【发布时间】:2013-04-20 07:41:47 【问题描述】:

我有一个非常简单的应用程序,其中包含几个 UIViewControllers(比如 VC_AVC_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'

实现这种行为的正确方法是什么?

【问题讨论】:

【参考方案1】:

A.使用 UIViewController 的新 presentViewController:animated:completion 来呈现所有三个控制器,而不是旧的 modal 方法。

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

C.在任何视图控制器演示之前,请检查此标志。如果是,设置为否。然后介绍VC。在完成块中,再次将标志设置为 YES。

D.当呈现初始视图控制器(无论是 VC_A 还是 VC_B)时,应用程序应忽略此标志。

其中一个陷阱是,如果在视图控制器处于转换状态时按下按钮或本地通知过期,则不会呈现新的 VC。如果需要,可以改进此逻辑以在之后呈现它。

【讨论】:

谢谢。这似乎可以完成这项工作。虽然我想知道是否有“内置”解决方案。 这里也一样,看看有没有人有这个解决方案。【参考方案2】:

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

【讨论】:

谢谢。如果同时开始另一个过渡怎么办?

以上是关于如何正确呈现视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

呈现两个视图控制器,关闭正确的视图控制器

iOS 8 中呈现的视图控制器中的界面方向不正确

从模态呈现的视图控制器内部呈现 UIPopoverController

呈现模态视图控制器的延迟

从 AppDelegate 呈现特定的视图控制器

如何关闭模态视图控制器,然后立即让呈现视图控制器呈现不同的模态视图控制器?