如何以编程方式从标签栏控制器卸载视图控制器?

Posted

技术标签:

【中文标题】如何以编程方式从标签栏控制器卸载视图控制器?【英文标题】:How to programatically unload a view controller from Tab bar controller? 【发布时间】:2017-12-11 11:32:21 【问题描述】:

我在情节提要中创建了一个标签栏控制器,其中包含 5 个标签栏项目。我想以编程方式从标签栏堆栈的“viewcontrollers”数组中删除一个视图控制器。当我删除上述视图控制器时,我还希望该应用程序显示一些其他选项卡项。我试过下面的代码,但它不起作用。

if let tabBarController = self.storyboard?.instantiateViewController(withIdentifier: "tabbar") as? UITabBarController 
    tabBarController.viewControllers?.remove(at: 2)
    tabBarController.selectedIndex = 1

【问题讨论】:

您是否尝试过分配一个新的 viewControllers 数组,但该数组缺少您要删除的那个? @MilanNosáľ 不,我刚刚从数组中删除了视图控制器。会试试的。 @MilanNosáľ 它不起作用,即使视图控制器正在被删除。 试试我的更新答案 @MilanNosáľ 现在试过了..仍然无法正常工作..它与在情节提要中创建标签栏有关吗? 【参考方案1】:

重新分配viewControllers 属性,去掉你不想要的:

if let tabBarController = self.storyboard?.instantiateViewController(withIdentifier: "tabbar") as? UITabBarController 
    tabBarController.selectedIndex = 1
    var controllers = tabBarController.viewControllers
    controllers.remove(at: 2)
    tabBarController.viewControllers = controllers

现在这段代码没问题,但问题出在下面一行:

let tabBarController = self.storyboard?.instantiateViewController(withIdentifier: "tabbar") as? UITabBarController

这将创建一个新的UITabBarController 实例 - 但您希望访问由故事板实例化并显示在屏幕上的实例。但是,如果没有更多上下文,就很难为您提供有关如何访问它的建议。考虑到您从直接嵌入在标签栏控制器中的 viewController 调用此代码,我将从以下开始:

if let tabBarController = self.tabBarController 
    tabBarController.selectedIndex = 1
    var controllers = tabBarController.viewControllers
    controllers.remove(at: 2)
    tabBarController.viewControllers = controllers

【讨论】:

问题出在“instantiateViewController”行。这个方法实际上创建了一个新的视图控制器实例。【参考方案2】:

试试这个:

    if let tabBarController = self.storyboard?.instantiateViewController(withIdentifier: "tabbar") as? UITabBarController 
        var viewControllers = tabBarController.viewControllers
        viewControllers.remove(at: 2)
        tabBarController.viewControllers = viewControllers
        tabBarController.selectedIndex = 1
    

【讨论】:

当我签入调试器时,我可以看到视图控制器正在从“viewControllers”数组中删除。但是应用程序仍在显示视图控制器,并且“viewDidLoad”没有被再次调用。【参考方案3】:
if let tabBarController = self.tabBarController 

    let indexToRemove = 3

    if indexToRemove < tabBarController.viewControllers?.count 

        var viewControllers = tabBarController.viewControllers

        viewControllers?.remove(at: indexToRemove)

        tabBarController.viewControllers = viewControllers
    

【讨论】:

当我签入调试器时,我可以看到视图控制器正在从“viewControllers”数组中删除。但是应用程序仍在显示视图控制器,并且“viewDidLoad”没有被再次调用。

以上是关于如何以编程方式从标签栏控制器卸载视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式导航到另一个故事板上的导航控制器和标签栏控制器内的视图控制器

以编程方式为 ViewController 创建标签栏

当以编程方式设置根视图控制器时,导航和标签栏丢失

如何以编程方式点击标签栏项目(未选中索引)

如何知道我之前在 iOS 中的标签栏视图控制器是哪个?

从标签栏控制器模态显示视图