我正在尝试将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一起使用吗?
答案 0 :(得分:0)
传递给函数准备 - segue: UIStoryboardSegue
的参数包含您的目的地(UITabBarController
) - 如果您已在故事板中正确设置。
所以实际上你要做的不是初始化一个新对象,而是从segue
对象中获取它:
let tabBar = segue.destinationViewController as! TabBarController
这将使您的代码有效。
关于应用程序的体系结构有一个全新的故事 - 无论是去MVC还是MVVM,MVP或VIPER。这与您关于优雅存储用户ID的问题有关。我无法直接回答这个问题,因为它主要是基于意见的。亲自尝试,找到合适的抽象层次。
对于某些引用,here是我的OSS项目,我将Firebase交互封装在一个对象中,该对象为其他View Controller提供了使用的接口。但同样 - 如果你是从iOS和/或一般的编程开始,也许它不是最好的开始架构。