我知道这个问题已经在堆栈溢出上问了很多。所以我有一个TabBarController,它有2个NavigationController,两个NavigationController都有一个TableViewController。我正在使用firebase来获取用户,将用户保存到名为currentUser的变量中。现在我的问题从这里开始,我想将第二个Navigation / Tableview控制器标题设置为用户的名字。我知道如何使用prepare for segue传递数据,但TabBarController中没有segue。
我找到了一个解决方案,不确定它的好坏。我所做的是让第一个控制器成为标签栏的代表。然后我添加了tabBarController做了select方法。这是代码。
class FirstTableVC: UITableViewController, UITabBarControllerDelegate {
var currentUser: User?
override func viewDidLoad() {
super.viewDidLoad()
tabBarController?.delegate = self
}
//Code that saves user
func code() {
...
...
...
}
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
if viewController == tabBarController.viewControllers![1] {
let navController = tabBarController.viewControllers![1] as? UINavigationController
let secondTableVC = navController?.topViewController as! SecondTableVC
secondTableVC.currentUser = currentUser
}
}
}
class SecondTableVC: UITableViewController {
var currentUser: User?
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.title =currentUser?.name
}
}
这可行,但不确定这是否是一个好方法。我想知道是否有更好的方式或更有效的方式。谢谢:))
添加了: 好的,请阅读此article有关使用tabController传递数据的信息。作者说我们应该使用应用程序的状态传递数据。我不太确定他的意思是什么。这就是我的意思。
示例代码:
class Person {
var name: String
var email: String
static var currentPerson: Person?
init(name: String, email: String) {
self.name = name
self.email = email
}
}
有些人可以帮我澄清一下。感谢。
答案 0 :(得分:0)
此解决方案没有任何问题。另一种方法是让一个抽象的类负责可以从FirstTableVC
和FirstTableVC
SecondTableVC
负责)
答案 1 :(得分:0)
在FirstTableVC中添加此内容
func code() {
...
...
...
self.changeTabbarTitle()
}
func changeTabbarTitle() {
if let items = self.tabBarController?.tabBar.items {
items[1].title = currentUser?.name
}
}
答案 2 :(得分:0)
您可以使用委托协议
在FirstViewController中创建NavigationTitle协议
protocol NavigationTitle{
func setTitle(name:String)
}
class FirstViewController: UITableViewController,UITabBarControllerDelegate{
var delegate: NavigationTitle?
func setCurrentUser(){
delegate.setTitle(name:self.currentUser?.name)
}
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
if viewController == tabBarController.viewControllers![1] {
let navController = tabBarController.viewControllers![1] as? UINavigationController
let secondTableVC = navController?.topViewController as! SecondTableVC
self.delegate = secondTableVC.self
}
}
}
在SecondVC中实施协议
class SecondVC: UITableViewController,NavigationTitle{
func setTitle(name:String){
navigationItem.title = name
}
}