关闭呈现模式 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的主要内容,如果未能解决你的问题,请参考以下文章

呈现和关闭模式小部件流的正确方法是啥?

在关闭另一个模式视图控制器后呈现一个模式视图控制器

在 iOS 13 中呈现全屏模式时是不是可以使用滑动关闭?

从 NavigationView 呈现的 SwiftUI 关闭模式表(Xcode Beta 5)

如何在 swift 中呈现自定义模式 [关闭]

Swift 如何在关闭模式后在根导航中呈现视图