如何多次推送同一个 ViewController?

Posted

技术标签:

【中文标题】如何多次推送同一个 ViewController?【英文标题】:How can I push the same ViewController more than once? 【发布时间】:2019-06-25 14:38:16 【问题描述】:

我有一个列表,我想显示 3 次(单击特定单元格时从一个列表到另一个列表)。为此,我使用了一个包含我的 ListView 的 XIB。我还设置了一个 NavigationController 来制作推送动画。

这就是我在 rootViewController 中调用 pushViewController 方法的方式。

    case "Groupe" :
        //this is OK since it's the first time I push the ViewController
        service.getGroupe()
        let vueGroupe = vueListe!
        navigationController?.pushViewController(vueGroupe, animated: true)
        vueListe.navigationItem.title = "Groupe View";
    case "Categorie" :
        //this is not
        let vueCat = vueListe!
        service.getCategorie(ids: elem!)
        navigationController?.pushViewController(vueCat, animated: true)
        vueListe.navigationItem.title = "Groupe View";

使用此代码,我收到以下错误:

“不支持多次推送同一个视图控制器实例”

【问题讨论】:

看起来它在错误中说得对...... “将同一个视图控制器实例推送多个......”。 (重点强调。)只需创建视图控制器的另一个实例。是的,对我来说,这似乎是一个糟糕的设计——要么使用相同的视图控制器和单独的视图(不是控制器),要么使用其他东西。最后一个提示 - 如果您真的需要在三个类似的控制器之间共享大部分 VC 逻辑,请考虑 (1) 将该代码删除到一个共享的框架目标中,以及 (2) 将您的控制器子类化为三个单独的 - 你不应该这样得到任何错误。 【参考方案1】:

您应该创建UIViewController 对象的新实例并推送它。

所以,在你的代码中,它会是这样的:

case "Groupe":
    service.getGroupe()
    let vueGroupe = VueListeViewController() // I would create a new view controller here as well
    navigationController?.pushViewController(vueGroupe, animated: true)
    vueListe.navigationItem.title = "Groupe View";
case "Categorie":
    let vueCat = VueListeViewController() // New instance
    service.getCategorie(ids: elem!)
    navigationController?.pushViewController(vueCat, animated: true)
    vueListe.navigationItem.title = "Groupe View";

【讨论】:

我不得不更换我的代表,但这是解决方案的一部分,谢谢!

以上是关于如何多次推送同一个 ViewController?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ViewController 中分离(推送)到 NavigationController 中嵌入的另一个 ViewController?

如何找到推送了哪个 viewController?

如何从 modalViewController 推送 ViewController

如何检测您的 ViewController 是不是是从 AppDelegate 推送的?

如何在推送的 ViewController (Xcode) 中获得后退按钮

如何推送 ViewController 并使第一个控制器部分可见?