关闭视图控制器意外行为

Posted

技术标签:

【中文标题】关闭视图控制器意外行为【英文标题】:Dismiss View Controller unexpected behaviour 【发布时间】:2017-02-02 05:48:10 【问题描述】:

我遇到了关于 PresentDismiss ViewController 的奇怪问题。

例如:-

我在 ViewController A 然后我推到 B

所以在导航控制器堆栈中我们有 [A,B]

现在如果我在 B 上显示任何视图控制器(如 MFMailComposeViewController)

然后在发送邮件或删除草稿后,它会关闭 MFMailComposeViewController 并重定向到 A 而不是 B。

我对此进行了研究,但找不到任何替代方案。

【问题讨论】:

能否展示MFMailComposeViewControllerDelegatedidFinishWithResult方法? 分享您如何添加/删除(推送/弹出/呈现/关闭)NavigationController、A、B 和 MFMailComposeViewController 的代码。 【参考方案1】:

如果你在 ViewControllerB 的 MFMailComposeViewControllerDelegate 的 didFinishWithResult 方法中调用了 Popviewcontroller 方法,那么它是可能的。 而是避免在 didFinishWithResult 方法调用中调用 PopViewController 方法。

【讨论】:

【参考方案2】:

希望这会有所帮助。在 A -> B 之间切换时使用它。

```let storyboard = UIStoryboard(name: "Main", bundle: nil)

desiredViewController = storyboard.instantiateViewController(withIdentifier: "desiredViewController")

UIApplication.shared.delegate?.window??.rootViewController? = 想要的视图控制器```

【讨论】:

【参考方案3】:

试试这个从 B 展示 MFMailComposeViewController

self.navigationController?.present(MFMailComposeViewController, animated: true, completion: nil)

你可能用过

self.present(MFMailComposeViewController, animated: true, completion: nil)

希望对你有帮助

【讨论】:

【参考方案4】:

您好,您可以这样做,当您在发送邮件或删除草稿后关闭时,它会关闭 MFMailComposeViewController,之后您可以检查 ViewController_Identifier 是否为“A_Screen”,然后避免或转义它。否则,如果它是“B-Screen”,则导航到该视图控制器。

根据需要使用此逻辑进行导航。

let targetView: String! = self.restorationIdentifier
    if targetView == "A_Screen"
                //Do nothing
            
            else
    let B_View = self.storyboard?.instantiateViewController(withIdentifier: "B_Screen") as! BViewController

                self.navigationController?.pushViewController(B_View, animated: true)
            

确保您已为 ViewControllers 设置了 identifierID。

希望对你有所帮助。

【讨论】:

以上是关于关闭视图控制器意外行为的主要内容,如果未能解决你的问题,请参考以下文章

推动视图控制器时防止键盘关闭

推送视图控制器后出现意外延迟

iOS - 关闭视图控制器后标签栏变为透明

呈现一个新的视图控制器然后关闭它,调用父视图控制器上的 init()

访问另一个视图控制器的功能时意外发现 nil

如何绑定 SwiftUI 和 UIViewController 行为