如何动态填充标签栏控制器的标签栏。? (在 swift -- iOS 9)
How to dynamically populate Tab Bar controller's tab bars.? (in swift -- iOS 9)
我正在开发一个 iOS 应用程序,其中的入口点是登录屏幕。
然后在登录后,转到标签栏控制器。
现在我想根据用户登录的级别动态填充选项卡栏项目的数量和内容。
例如 ->
1 级登录 - 标签栏项目
- 选项 A
- 选项 B
- 选项 C
- 选项 D
2 级登录 - 标签栏项目
- 选项 C
- 选项 D
如何将标签栏控制器动态绑定到某些数据,以创建这种 od 视图。?
我建议采用以下架构:
每当用户以 1 级访问权限登录时 - 您需要在 NSUserDefaults 中为该用户保存 1 级值。
每当用户以 2 级访问权限登录时 - 您需要在 NSUserDefaults 中为该用户保存 level2 值。
之后,当您对选项卡控制器执行 segue 时,您需要检查哪个值存储在 NSUserDefaults 中并显示适当的选项卡。
只是不要忘记在用户注销时删除值。
此外,我确信有更好的方法可以做到这一点,但这是我首先想到的。干杯。
Swift 4 - Xcode 9
您可以在 运行 时动态更改 tabBarController 使用的 UIViewController 数组,方法是:
self.viewControllers = arrayOfUIViewControllers
在您的特定情况下,有 2 个可用的 UIViewController 数组,当 tabBarController 加载时(大概是在登录后),根据登录数据为级别 1 显示一个数组或为级别 2 显示另一个数组。
为了解决更广泛的问题,演示另一个用户可以在 运行 时间动态生成和删除选项卡的案例可能也会有所帮助。
- 在故事板中,我有一个连接到视图控制器的选项卡栏控制器。
- View Controller 有 Storyboard ID "NewTab" 并且是 "ViewController" 的子类它还有两个 UIButtons "Add" 和 "Remove" 并且设置了 Tab Bar Item Title到“1”
选项卡名称将来自 Tabs.swift,这是我存储选项卡数据的 CoreData 占位符。
class Tabs: NSObject {
let tabs: [String] = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
}
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 链接到添加按钮,@IBAction removeTab 链接到故事板删除按钮。如果选项卡少于 2 个,或者如果您 运行 个选项卡名称不足,这些按钮将不起作用。
我选择将这个示例包含在我的回答中,因为我一直在寻找它并最终将一个放在一起,所以也许其他人会发现它很有用,因为它与广泛的问题标题相关。
我正在开发一个 iOS 应用程序,其中的入口点是登录屏幕。 然后在登录后,转到标签栏控制器。 现在我想根据用户登录的级别动态填充选项卡栏项目的数量和内容。
例如 ->
1 级登录 - 标签栏项目
- 选项 A
- 选项 B
- 选项 C
- 选项 D
2 级登录 - 标签栏项目
- 选项 C
- 选项 D
如何将标签栏控制器动态绑定到某些数据,以创建这种 od 视图。?
我建议采用以下架构:
每当用户以 1 级访问权限登录时 - 您需要在 NSUserDefaults 中为该用户保存 1 级值。
每当用户以 2 级访问权限登录时 - 您需要在 NSUserDefaults 中为该用户保存 level2 值。
之后,当您对选项卡控制器执行 segue 时,您需要检查哪个值存储在 NSUserDefaults 中并显示适当的选项卡。
只是不要忘记在用户注销时删除值。
此外,我确信有更好的方法可以做到这一点,但这是我首先想到的。干杯。
Swift 4 - Xcode 9
您可以在 运行 时动态更改 tabBarController 使用的 UIViewController 数组,方法是:
self.viewControllers = arrayOfUIViewControllers
在您的特定情况下,有 2 个可用的 UIViewController 数组,当 tabBarController 加载时(大概是在登录后),根据登录数据为级别 1 显示一个数组或为级别 2 显示另一个数组。
为了解决更广泛的问题,演示另一个用户可以在 运行 时间动态生成和删除选项卡的案例可能也会有所帮助。
- 在故事板中,我有一个连接到视图控制器的选项卡栏控制器。
- View Controller 有 Storyboard ID "NewTab" 并且是 "ViewController" 的子类它还有两个 UIButtons "Add" 和 "Remove" 并且设置了 Tab Bar Item Title到“1”
选项卡名称将来自 Tabs.swift,这是我存储选项卡数据的 CoreData 占位符。
class Tabs: NSObject { let tabs: [String] = ["1", "2", "3", "4", "5", "6", "7", "8", "9"] }
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 链接到添加按钮,@IBAction removeTab 链接到故事板删除按钮。如果选项卡少于 2 个,或者如果您 运行 个选项卡名称不足,这些按钮将不起作用。
我选择将这个示例包含在我的回答中,因为我一直在寻找它并最终将一个放在一起,所以也许其他人会发现它很有用,因为它与广泛的问题标题相关。