【问题标题】:Pass data using TabBarController使用 TabBarController 传递数据
【发布时间】:2018-02-23 20:04:51
【问题描述】:

我知道这个问题已经被问到很多关于堆栈溢出的问题。所以我有一个 TabBarController,它有 2 个 NavigationController,这两个 NavigationController 都有一个 TableViewController。我正在使用 firebase 来获取用户,将用户保存到一个名为 currentUser 的变量中。现在我的问题从这里开始,我想将第二个 Navigation/Tableview 控制器标题设置为用户名。我知道如何使用为 segue 做准备来传递数据,但是 TabBarController 中没有 segue。

我找到了一个解决方案,不知道它是好是坏。我所做的是让第一个控制器成为标签栏的代表。然后我添加了 tabBarController 确实选择了方法。这是代码。

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
    }
}

请帮我澄清一下。谢谢。

【问题讨论】:

    标签: swift uitabbarcontroller swift4


    【解决方案1】:

    这个解决方案没有任何问题。另一种方法是让一个抽象类负责用户登录对象(而不是 FirstTableVC 负责),可从 FirstTableVCSecondTableVC 访问

    【讨论】:

    • 能否提供示例代码。真的很感激。
    【解决方案2】:

    在你的 FirstTableVC 中添加这个

           func code() {
                ...
                ...
                ...
    
                self.changeTabbarTitle()
            }
    
            func changeTabbarTitle() {
                if let items = self.tabBarController?.tabBar.items {
                    items[1].title = currentUser?.name
                }
            }
    

    【讨论】:

    • 嘿文森特,阅读这篇文章它有一个关于使用 tabController 传递数据的部分。这是link。现在他所说的应用程序状态是什么意思?非常感谢您的帮助
    【解决方案3】:

    您可以使用委托协议

    在 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
    }
    }
    

    【讨论】:

    • 嘿,我是这样做的,但是我遇到了一个错误。我读了这篇文章,它有一节关于使用 tabController 传递数据。这是link。现在他所说的应用程序状态是什么意思?非常感谢您的帮助
    • 查看那篇文章的问答部分,作者在那里解释了State是什么
    猜你喜欢
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 2014-07-17
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多