我是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”下载的用户详细信息,因此我认为应该是正确的。 希望有人可以帮助我:)
答案 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"] ?? ""
}
}
}