关闭呈现模式 ViewController
Posted
技术标签:
【中文标题】关闭呈现模式 ViewController【英文标题】:Dismissing presenting modal ViewController 【发布时间】:2015-06-25 14:16:37 【问题描述】:我有一个ViewController
,它显示了一个模态视图控制器。在这个模态视图控制器中,我想展示一个MailComposeViewController
。我的问题是在解雇期间。我想同时关闭两个显示的ViewController
。
我的前任抓取了presentingViewController
的一个实例,发送一条消息以显示MailComposeViewController
,并在BaseViewController
中关闭了模态视图控制器。
[self dismissViewControllerAnimated:YES
completion:^
[self presentViewController:mailViewController animated:YES completion:nil];
];
我目前试图阻止这种情况,因为它是一个神级(超过 5kloc),我需要将它拆开。
所以我尝试在模态 ViewController 中使用相同的模式,但改用了self.presentingViewController
。这导致只是关闭模态 ViewController,但不显示任何内容。
在解雇之前抓取一个实例有效,但解雇的委托回调被忽略(难怪,因为模式 ViewController 不再显示)。
所以进入委托回调- (void) mailComposeController:(MFMailComposeViewController*) controller didFinishWithResult:(MFMailComposeResult) result error:(NSError*) error
我试图在没有动画的情况下在 MailComposeViewController
之前关闭模态 ViewController。这也删除了MailComposeViewController
(也不足为奇)。我可以先关闭MailComposeViewController
,然后关闭模态视图控制器,但这会创建一个不同的动画,其中控制器在不同的时间和顺序被关闭(我们都知道用户体验如何对类似的东西做出反应;))。
还有其他选项,我可以先关闭模态视图控制器,然后显示MailComposeViewController
,而BaseViewController
中没有任何关闭代码?
谢谢:)
【问题讨论】:
【参考方案1】:呈现视图控制器负责关闭它呈现的视图控制器。如果您在呈现的视图控制器本身上调用此方法,它会自动将消息转发到呈现的视图控制器。
另一方面,呈现视图控制器当然负责呈现。因此,如果在 BaseViewController
中没有任何解除代码,就无法呈现新的视图控制器,在您的情况下是呈现视图控制器
你可以在没有动画的情况下关闭,然后呈现新的
[self dismissViewControllerAnimated:NO
completion:^
[self presentViewController:mailViewController animated:YES completion:nil];
];
【讨论】:
【参考方案2】:似乎我在获取presentingViewController
的实例并使用它时是错误的。我只需要在任何地方使用它。所以我最终得到了这段代码来关闭modal ViewController
并显示MailComposeViewController
:
self.presenter = self.presentingViewController;
[self dismissViewControllerAnimated:YES
completion:^
[self.presenter presentViewController:mailViewController animated:YES completion:nil];
];
要关闭 MailComposeViewController
,我在 delegateMethod 中调用:[self.presenter dismissViewControllerAnimated:YES completion:nil];
。
【讨论】:
以上是关于关闭呈现模式 ViewController的主要内容,如果未能解决你的问题,请参考以下文章