无法以模态方式呈现以前的View Controller

时间:2013-01-09 23:23:30

标签: ios objective-c uiviewcontroller

我有一个应用程序(现在无法更改架构)。

第1页,使用presentModalViewController呈现第2页(一个Tabnav)。 然后第2页也可以使用presentModalViewController(通过按钮)显示第1页。

问题是,当我重新呈现第1页时,应用程序崩溃,因为第1页已经呈现或者其他内容。我可以忽略显示第1页的第2页,但我不能采用该选项,因为还有其他页面可以以模态方式呈现,然后它们将在堆栈下面而不是Page1。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present modally an active controller <AccountViewController: 0xc3824a0>.'
*** First throw call stack:
(0x1f3d012 0x1a32e7e 0xa63721 0xa64777 0xa647b7 0x908e 0x1a46705 0x97d920 0xbb9b24 0x1a46705 0x97d920 0x97d8b8 0xa3e671 0xa3ebcf 0xa3dd38 0x9ad33f 0x9ad552 0x98b3aa 0x97ccf8 0x2e48df9 0x2e48ad0 0x1eb2bf5 0x1eb2962 0x1ee3bb6 0x1ee2f44 0x1ee2e1b 0x2e477e3 0x2e47668 0x97a65c 0x258d 0x24b5 0x1)
libc++abi.dylib: terminate called throwing an exception

3 个答案:

答案 0 :(得分:1)

如果您想再次显示第1页,那么您应该关闭当前视图控制器(即第2页),或者您应该创建第1页的新实例并以模态方式显示该实例。

当你已经在模态呈现的视图控制器中时,开始呈现任何内容都是一个坏主意。

你应该提出一个模态vc,然后解雇它。应该是它。

重读你的OP。说真的,扔掉结构并重新设计。你有什么似乎是一团糟。如果你有很多转换,为什么不只是使用导航控制器?

答案 1 :(得分:1)

您将无法在Page1中展示Page2,因为Page1已经位于模态堆栈中。 “Page1已经呈现”是Xcode的简写方式。

由于你必须继续使用模态堆栈,你可以做的就是仔细清楚地表达它,以便在任何时候,你可以通过展示必要的ViewController OR来到达任何页面,从而解雇为了“跳转”到堆栈中的特定页面,ViewControllers的数量。

wL_对this question的回答是开始解释如何一次解除多个模态ViewController的好地方(注意选择器名称在iOS 6中略有改变)。当然,如果您有很多模态ViewControllers,那么您将花费大量内存跟踪每个页面都在堆栈中。

我应该指出这是一个相当糟糕的设计 - 但正如你所说,你不能改变架构,这是解决问题的一种方法。

伪代码:

Button pressed to jump to page:
    PageIsInStackAlready?
        Yes
           Calculate/retrieve page position in stack
           Dismiss necessary number of ViewControllers
        No
           Present new modal ViewController
           Store/account for new page's location on stack

正如我所说,这可能有效,但它肯定会与系统作斗争。

答案 2 :(得分:1)

你了解一个类和一个实例之间的区别吗?如果要呈现AccountViewController,则需要创建不同的 AccountViewController实例并显示该实例。听起来你正在尝试做的是提供已经在界面中的相同AccountViewController实例。显然这是不可能的。

我同意其他人的说法,你的界面只是糟糕的设计,但至少这会回答你所问的语言问题。