将数据传递到标签栏

时间:2017-03-27 13:23:22

标签: swift firebase firebase-authentication

我正在尝试将Twitter克隆用于练习。我的后端是Firebase,我有Twitter登录。

我设法实现Twitter登录,但现在不知道如何将当前用户uid传递给所有标签栏视图控制器。

现在我的用户模型只有id(字符串类型)和帖子(Post数组)。

class User {

    // MARK: Properties
    let id: String!
    var posts: [Post]?

    init(id: String) {
        self.id = id
    }

}

这是我登录用户的LoginViewController部分,现在我必须初始化新对象

// Checks if user is already logged in and transfers them to feed
FIRAuth.auth()?.addStateDidChangeListener() { (auth, user) in
      if user != nil {
           self.performSegue(withIdentifier: "Login", sender: self)
      }     
}

我为Tab Bar创建了自定义控制器,只有一个用户属性:User?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "Login" {
        let intializeUser = User(id: (FIRAuth.auth()?.currentUser?.uid)!)
        let tabBar = TabBarViewController()
        tabBar.user = intializeUser
    }
}

但这不起作用。有人可以解释如何优雅地存储用户uid,然后将其与其他所有View Controller一起使用吗?

1 个答案:

答案 0 :(得分:0)

传递给函数准备 - segue: UIStoryboardSegue的参数包含您的目的地(UITabBarController) - 如果您已在故事板中正确设置。

所以实际上你要做的不是初始化一个新对象,而是从segue对象中获取它:

let tabBar = segue.destinationViewController as! TabBarController

这将使您的代码有效。

关于应用程序的体系结构有一个全新的故事 - 无论是去MVC还是MVVM,MVP或VIPER。这与您关于优雅存储用户ID的问题有关。我无法直接回答这个问题,因为它主要是基于意见的。亲自尝试,找到合适的抽象层次。

对于某些引用,here是我的OSS项目,我将Firebase交互封装在一个对象中,该对象为其他View Controller提供了使用的接口。但同样 - 如果你是从iOS和/或一般的编程开始,也许它不是最好的开始架构。