0

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

第 1 页,显示第 2 页(一个 Tabnav),带有 presentModalViewController。然后第 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
4

3 回答 3

1

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

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

您应该呈现一个模态 vc,然后将其关闭。应该是这样的。

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

于 2013-01-09T23:36:47.360 回答
1

您将无法在模态堆栈上按Page1原样Page2进行演示。Page1Page1is already present”是 Xcode 的简写方式。

由于您必须继续使用模态堆栈,您可以做的就是仔细地表达它,以便在任何时候,您都可以通过呈现必要的ViewControllerOR 进入任何页面,关闭一些ViewControllers以“跳转”到堆栈上的特定页面。

wL_ 对这个问题的回答是一个很好的起点,可以解释如何一次关闭多个模式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

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

于 2013-01-09T23:38:02.630 回答
1

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

我同意其他人的观点,即您的界面只是糟糕的设计,但至少这回答了您提出的语言问题。

于 2013-01-09T23:38:19.170 回答