解决多个模态视图控制器的问题

时间:2010-03-19 00:37:40

标签: iphone objective-c cocoa cocoa-touch iphone-sdk-3.0

我无法正常显示模态视图控制器。我有一个父视图控制器,它是模态视图A 的委托。在模态视图A中我呈现模态视图B,并具有委托dimiss模态视图A.

当出现模态视图B时,它似乎显示但屏幕变暗,并且UI锁定,但应用程序不会崩溃。我将动画设置设置为NO,我仍然遇到同样的问题。

活动顺序:

  1. 父视图显示模态视图A
  2. 模态视图A在模态视图中显示模态视图B控制器
  3. 父视图通过委派
  4. 解除模态视图中的模态视图A.
  5. 这是我的用户界面挂起的地方,我可以看到模态视图B但无法点击它或做任何事情

9 个答案:

答案 0 :(得分:19)

你可以用这个

[[[self presentingViewController] presentingViewController]  dismissModalViewControllerAnimated:YES];

答案 1 :(得分:4)

模态视图控制器必须具有父视图控制器才能显示。如果您关闭父视图控制器(在您的情况下为“模态视图A”),行为将是不可预测的。

如果你确定嵌套的模态视图控制器是你真正想要的,你需要以相反的顺序解除它们;等到你完成了“B”,然后解雇“B”,然后解雇“A”。

如果您不需要模式演示样式,最好使用UINavigationController来维护您的视图控制器堆栈。

更新:以下是重新排列您的活动顺序的方法。为清晰起见而作为代码提供。

  1. [parentView presentViewController:modalViewControllerA animated:YES]
  2. [modalViewControllerA presentViewController:modalViewControllerB animated:YES]
  3. [modalViewControllerA dismissModalViewControllerAnimated:YES]
  4. [parentView dismissModalViewControllerAnimated:YES]

答案 2 :(得分:4)

通过让我的parentViewController充当委托来解决。这是我的订单:

[parentView presentViewController:modalViewControllerA animated:YES]
[parentView dismissModalViewControllerAnimated:YES]
[parentView presentViewController:modalViewControllerB animated:YES]
//Modal B dismisses himself

在我的委托方法中,我需要确保在呈现Modal B之前我解雇了Modal A

答案 3 :(得分:1)

适用于iOS 6+- presentViewController:animated:completion:

[[[self presentingViewController] presentingViewController]  dismissViewControllerAnimated:YES completion:nil];

答案 4 :(得分:1)

在Swift 2.1中

你可以尝试

self.presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)

适合我

查看A - >查看B - >查看C

在视图C中应用此代码,您将登陆View A

答案 5 :(得分:0)

可能会很久但是..我遇到了同样的问题,这是唯一一个有一些答案的帖子。

,我不能通过将parentViewController的委托设置为self来获得你的意思

我现在正在做的是

[self presentModalViewController:ViewControllerA animated:YES];
[self dismissModalViewControllerAnimated:YES];// inside ViewControllerA
[self presentModalViewController:ViewControllerB animated:YES];
[self dismissModalViewControllerAnimated:YES];// inside ViewControllerB

问题出在viewControllerA之后,viewControllerB视图没有呈现。

谢谢,

答案 6 :(得分:0)

我有一个主视图,需要显示一个modalview1,其中一个按钮呈现一个modalview2。看起来和你需要的一样。 但是modalview2中有一个按钮可以转发到主视图。

所以解决方案是: 主视图使用modalview1作为rootController呈现UINavigationController。然后modalview1通过“[self.navigationController modalview2 animated:YES];”提供modalview2。

当modal2需要转发到主视图时,只需制作“[self.parentViewController dismissModalViewControllerAnimated:YES];”和UINavigationController是隐藏的。

希望很清楚。

答案 7 :(得分:0)

简单:

驳回所有观点:

[self dismissModalViewController animated:YES];
[self dismissModalViewController animated:YES];
[self dismissModalViewController animated:YES];
[self dismissModalViewController animated:YES];

(每个添加的模态视图一个)

然后呈现一个新的模态视图控制器

答案 8 :(得分:0)

关于dismiss(animated:completion:)方法的Apple文档。

Discussion部分,它说:

any intermediate view controllers are simply removed from the stack.
  

如果您连续呈现多个视图控制器,从而构建一堆呈现的视图控制器,则在堆栈中较低的视图控制器上调用此方法会解除其直接子视图控制器以及堆栈上该子视图上方的所有视图控制器。发生这种情况时,只有最顶层的视图以动画方式被删除; 任何中间视图控制器都只是从堆栈中删除。最顶层的视图使用其模态过渡样式被忽略,这可能与堆栈中较低的其他视图控制器使用的样式不同。

换句话说,如果视图控制器堆栈如下

Root -> A -> B -> C -> D ... -> Z

D调用dismiss方法,所有视图控制器behide D,例如:(E ... Z),将从堆栈中删除。