如何正确关闭模态呈现的控制器

Posted

技术标签:

【中文标题】如何正确关闭模态呈现的控制器【英文标题】:How to correctly close modal presented controller 【发布时间】:2016-09-23 11:02:27 【问题描述】:

我正在使用故事板中的直接导航 segue 或从代码中调用 segue 打开一个 navigationController,但仍然在故事板上创建。

例子:

 self.performSegue(withIdentifier: "addNew", sender: nil)

然后通过模态转换打开一个导航控制器。然后 NC 有几个视图控制器,它们上面都有关闭按钮,当我点击它时,它会使用以下方法关闭 NC:

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

但之后当我在 TabbarController 上的不同 ViewController 之间切换或使用推送视图打开其他视图时,我得到:

Unbalanced calls to begin/end appearance transitions for

而且打开视图上的 viewWillAppear 也不会被调用。所以谁能告诉我我是否正确关闭了 NC 或者是否有其他方法可以防止错误。

编辑1: 将结束通话从 controller.navigationController?.dismiss(animated: true, completion: nil)

到 self.navigationController?.dismiss(animated: true, completion: nil) 只是为了让问题更容易。

也累了:

self.dismiss(animated: true, completion:nil)

编辑2: 从 UITabbarController 上的 NC 上的 VC 打开一个 NC 是不是很糟糕,或者将 NavigationControllers 作为 TabbarController 上的选项卡已经很糟糕了?

【问题讨论】:

self.navigationContro...... "Unbalanced calls to begin/end appearance transitions for DetailViewController" when pushing more than one detail view controller的可能重复 @Oleg Gordiichuk 不这么认为,因为如果我从不打电话给其他 NC,就不会出现问题 【参考方案1】:

您可能需要从控制器一侧关闭控制器:

// place this to the target controller, which handles you that modal view
self.dismiss(animated: true) 
    //completion:

self.dismiss(animated: true, completion:nil)

【讨论】:

有了这条线,我可以更快地解决问题,但感谢您的建议 那么,你把那条线放在哪里了?用什么方法? 我替换了 self.navigationController?.dismiss(animated: true, completion: nil) 但是在哪里,用什么方法? :) 我问的是方法,你把建议的行放在哪里。 在从导航栏中的按钮调用的方法中。方法写在当前在 NC 最上面的控制器上

以上是关于如何正确关闭模态呈现的控制器的主要内容,如果未能解决你的问题,请参考以下文章

从 uitabbarController 视图中关闭模态视图

如何从 appdelegate 呈现和关闭模态视图?

关闭模态视图控制器后呈现不同的视图控制器

关闭当前的模态视图控制器,然后呈现新的模态视图控制器

视图控制器以模态方式呈现/关闭时的通知?

如何从模态视图控制器调用呈现视图控制器的方法