如何动态填充Tab Bar控制器的标签栏。 (在swift中 – iOS 9)

我正在开发一个iOS应用程序,其入口点是登录屏幕。 然后在登录后,转到标签栏控制器。 现在,我想根据用户登录的级别动态填充选项卡栏项的数量和内容。

例如 – >

1级登录 – 标签栏项目

  • 选项A.
  • 选项B.
  • 选项C.
  • 选项D.

2级登录 – 标签栏项目

  • 选项C.
  • 选项D.

如何将标签栏控制器动态绑定到某些数据,以创建此类视图。

我建议遵循架构:

每当用户登录1级访问权限时 – 您需要在NSUserDefaults中为此用户保存level1值。

每当用户登录具有2级访问权限时 – 您需要在NSUserDefaults中为此用户保存level2值。

之后,当您执行segue到选项卡控制器时,您需要检查NSUserDefaults中存储的值并显示相应的选项卡。

如果用户注销,请不要忘记删除值。

此外,我确信有更好的方法可以做到这一点,但这是我想到的第一个。 干杯。

Swift 4 – Xcode 9


您可以使用以下命令在运行时动态更改tabBarController使用的UIViewControllers数组:

self.viewControllers = arrayOfUIViewControllers 

在您的特定情况下,有两个UIViewControllers数组可用,当tabBarController加载时(大概是在登录后),为级别1提供一个数组或根据登录数据显示另一个级别2的数组。


为了解决更广泛的问题,演示用户可以在运行时动态生成和删除选项卡的另一种情况也可能有所帮助。

  1. 在故事板中,我有一个连接到视图控制器的标签栏控制器。
  2. View Controller具有Storyboard ID“NewTab”并且是“ViewController”的子类,它还有两个UIButtons“Add”和“Remove”,并且Tab Bar Item Title设置为“1”
  3. 选项卡名称将来自Tabs.swift,它是CoreData的占位符,其中存储了选项卡数据。

     class Tabs: NSObject { let tabs: [String] = ["1", "2", "3", "4", "5", "6", "7", "8", "9"] } 
  4. ViewController.swift几乎可以做任何事情。

     import UIKit class ViewController: UIViewController { let tabs = Tabs().tabs var array: [UIViewController] = [] @IBAction func makeNewTab(_ sender: Any) { let newViewController: UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "NewTab") as UIViewController array = (self.tabBarController?.viewControllers)! if array.count < tabs.count { newViewController.title = tabs[array.count] array.append(newViewController) self.tabBarController?.setViewControllers(array, animated: true) } } @IBAction func removeTab(_ sender: Any) { array = (self.tabBarController?.viewControllers)! if array.count > 1 { let index = array.index(of: self) array.remove(at: index!) self.tabBarController?.setViewControllers(array, animated: true) } } } 

    所以在这里你实例化选项卡名称列表和一个空的ViewControlers数组。 @IBAction makeNewTab链接了Add按钮,@IBAction removeTab链接到storyboard Remove按钮。 如果少于2个选项卡或者用完选项卡名称,则按钮将不起作用。

我选择在我的答案中包含这个例子,因为我一直在寻找它并最终把它放在一起,所以也许其他人会发现它有用,因为它与广泛的问题标题有关。