使用TabBarController传递数据

时间:2018-02-23 20:04:52

标签: swift uitabbarcontroller swift4

我知道这个问题已经在堆栈溢出上问了很多。所以我有一个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
    }
}

有些人可以帮我澄清一下。感谢。

3 个答案:

答案 0 :(得分:0)

此解决方案没有任何问题。另一种方法是让一个抽象的类负责可以从FirstTableVCFirstTableVC

访问的用户登录对象(而不是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
}
}