如何以编程方式从标签栏控制器卸载视图控制器?
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”没有被再次调用。以上是关于如何以编程方式从标签栏控制器卸载视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章