Swift如何使用用户ID

时间:2019-02-02 17:24:08

标签: ios swift firebase firebase-realtime-database

我是Swift的新手,或者是整个编程领域的新手,我正在尝试学习如何在Swift中进行编程。 我有一个包含单元格(VC1)的表格视图,其中包含用户提供的不同信息。我想单击一个单元格以通过segue转到新的VC。此新的VC应该显示发布信息的用户的用户信息。我通过segue将userID从VC1传递到VC2。 在VC2中,我想使用userID下载用户信息。

我正在使用UserModel

import Foundation

class UserModel {

    var username: String?
    var email: String?
    var profilImageUrl: String
    var birthdayDate: String?
    var gender: String?

    init(dictionary: [String: Any]) {
        username = dictionary["username"] as? String
        email = dictionary["email"] as? String
        profilImageUrl = dictionary["profilImageURL"] as? String ?? ""
        birthdayDate = dictionary["Geburtsdatum"] as? String
        gender = dictionary["gender"] as? String
    }
}

传递userID VC1-> VC2有效,我使用打印命令对其进行了检查

我在VC2中的代码:

//MARK: - Outlets

@IBOutlet weak var nameLabel: UILabel!

//MARK: Var/ Let

var event: EventModel?
var users = [UserModel]()


var user: UserModel?{
    didSet {
        guard let _username = user?.username else {return}
        nameLabel.text = _username
    }
}

func loadUserDeatails(){
    guard let userID = event?.uid else {return}
    fetchUser(uid: userID)
}

func fetchUser(uid: String) {
    let userRef = Database.database().reference().child("users").child(uid)
    userRef.observeSingleEvent(of: .value) { (snapshot) in
        guard let dic = snapshot.value as? [String: Any] else {return}
        let newUser = UserModel(dictionary: dic)
        self.users.append(newUser)
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    loadUserDeatails()
    print(users)
}

nameLabel以及我尝试在ViewDidLoad中打印的数组(用户)都是空的。 变量“ dic”包含我通过“ guard let userID = event?.uid”下载的用户详细信息,因此我认为应该是正确的。 希望有人可以帮助我:)

1 个答案:

答案 0 :(得分:0)

我不确定event在做什么,但是一种方法是:

在VC1中: 在prepareforsegue中,一旦获得VC2的参考,

let vc2 = segue.destination as! VC2
vc2.userId = "<USER_ID>" // Pass userId to VC2

在VC2中:将执行didSet中的var userId,然后直接将用户名分配给nameLabel.text

var userId: String? {
        didSet {
            // Do the fetch user details here
            guard let userId = userId else {return}
            let userRef = Database.database().reference().child("users").child(userID)
            userRef.observeSingleEvent(of: .value) { (snapshot) in
                guard let dic = snapshot.value as? [String: Any] else {return}
                let newUser = UserModel(dictionary: dic)

                // Once your get user detail data, set the label text
                nameLabel.text = newUser["username"] ?? ""
            }
        }
    } 

尝试以下方法,它可能会起作用。

var user: UserModel?{
    didSet {
        guard let _username = user?.username else {return}

        guard let userID = event?.uid else {return}

        let userRef = Database.database().reference().child("users").child(userID)
        userRef.observeSingleEvent(of: .value) { (snapshot) in
            guard let dic = snapshot.value as? [String: Any] else {return}
            let newUser = UserModel(dictionary: dic)
            nameLabel.text = newUser["username"] ?? ""
        }
    }
}