如何在运行时在 TabBarcontroller 中排列标签栏项目?

Posted

技术标签:

【中文标题】如何在运行时在 TabBarcontroller 中排列标签栏项目?【英文标题】:How to arrange tabbar item at run time in TabBarcontroller? 【发布时间】:2016-12-14 06:11:00 【问题描述】:

我有带有 5 个视图控制器“A”、“B”、“C”、“D”、“E”的 TabBarcontroller。但我需要在运行时决定顺序取决于 API 响应。 例如。有时我需要显示“A”、“D”、“C”、“E”、“B”,即以随机顺序显示,或者有时我只需要显示“D”、“B”、“C”, “一个”

有没有办法处理这种情况?

我正在使用 Swift 3,但即使我掌握了一些逻辑或可能的方法,它也有助于解决我的问题。

我已经使用故事板创建了 TabBar 和 viewcontroller。

【问题讨论】:

如何创建标签栏控制器及其视图控制器? 这个问题很好,但不应该这样做,因为人们有肌肉记忆,而你的功能会搞砸。 @rmaddy 我更新了我的问题 @NikhilManapure 你是对的,但我们有一些功能..同意你,但我们可以在运行时以相同的顺序删除和添加随机 tabbaritems @sss 这可能是可能的,但您需要以编程方式创建 Tabbar 而不是使用情节提要。 【参考方案1】:
if  let tabBarController = ( self.window?.rootViewController as? UITabBarController ) 
    if var vcArray = tabBarController.viewControllers 
        //Arrange the array according to your need and set them again.
        tabBarController.viewControllers = vcArray
        //Arrange the array according to your need and set them again.
        var items =   tabBarController.tabBar.items
        tabBarController.tabBar.items = items
    

您必须处理selectedViewController。我已经在appdelegate中编写了上面的代码,但是您可以在上面的代码中获取appDelegate的对象并用作self

另请参阅 this 以获取另一种解决方案,您可以在其中以编程方式创建 tabCtrl 并对其进行操作。

【讨论】:

【参考方案2】:

您还没有包含代码,所以有点难以回应。

我要做的是,一旦你有了新的订单,就创建一个新的 TabBarController 并让新的覆盖现有的。

为了使用户更符合逻辑,您可以将用户移动到相同的 VC "A" "B" "C" ..(按新顺序)或让用户留在(替换的)屏幕上(第一/第二等)

【讨论】:

如果在storyboard中创建tabbarcontroller,这可能吗?【参考方案3】:

将 UITabBarController 的 viewControllers 属性设置为新排序的 viewContoller 数组。

下面的示例是让您的 viewControllers 反向排序(从 AppDelegate 调用)。

if let wTB = ( self.window?.rootViewController as? UITabBarController ) 
    if let wVCs = wTB.viewControllers 
        wTB.viewControllers = [ wVCs[ 4 ], wVCs[ 3 ], wVCs[ 2 ], wVCs[ 1 ], wVCs[ 0 ] ]
    

【讨论】:

以上是关于如何在运行时在 TabBarcontroller 中排列标签栏项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何在并行运行多个文件时在后台运行批处理文件

如何仅在代码第一次运行时在 python 中运行函数?

如何在python中运行其他代码时在后台运行循环

如何在启动时在后台运行django服务器?

如何在构建时在 Blazor 项目中运行 T4 模板

如何在运行时在php中重写URL