如何正确呈现视图控制器?
Posted
技术标签:
【中文标题】如何正确呈现视图控制器?【英文标题】:How to present view controller properly? 【发布时间】:2013-04-20 07:41:47 【问题描述】:我有一个非常简单的应用程序,其中包含几个 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'
实现这种行为的正确方法是什么?
【问题讨论】:
【参考方案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]。这应该会在当前转换完成时完成视图呈现。
【讨论】:
谢谢。如果同时开始另一个过渡怎么办?以上是关于如何正确呈现视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章