我已经追了两天但是我仍然不确定为什么我的变量没有通过导航视图控制器从我的登录视图控制器传递到聊天视图控制器。
我有一个查询Firebase的按钮,检查用户是否存在并返回用户的Firebase查询引用。然后,当它完成导航控制器的顶视图控制器以供使用时,我希望传递此Firebase查询引用。
在我的IBAction登录按钮中,我有:
var tempUserRef: FIRDatabaseReference?
channelRef.queryOrdered(byChild: "uid").queryEqual(toValue: uid).observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.exists() {
print("uid exist with \(snapshot.childrenCount) number of children")
for s in snapshot.children.allObjects as! [FIRDataSnapshot] {
tempUserRef = self.channelRef.child(s.key)
}
} else {
print("uid didn't exist")
if let name = self.nameField?.text { // 1
tempUserRef = self.channelRef.childByAutoId()
let channelItem = [
"name": name,
"uid": self.uid
]
tempUserRef?.setValue(channelItem)
}
}
self.userRef = tempUserRef
DispatchQueue.main.async {
self.performSegue(withIdentifier: "LoginToChat", sender: tempUserRef)
print("passsed \(self.userRef)")
}
})
这是我的话:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if "LoginToChat" == segue.identifier {
if let navVc = segue.destination as? UINavigationController {
if let chatVc = navVc.topViewController as? ChatViewController {
chatVc.senderDisplayName = nameField?.text
if let userRef = sender as? FIRDatabaseReference {
chatVc.userRef = userRef
print("passsing \(self.userRef) to \(chatVc)")
}
}
}
}
super.prepare(for: segue, sender: sender)
}
我的登录控制器上的打印语句看起来都很好但是当我到达聊天视图控制器时,userRef仍然是零。所以我的感觉是我有正确的segue输入和切换,但数据的异步性质与我的segue不一致。
聊天视图控制器正在使用JSQMessages库,如果这有所不同。
感谢您的帮助。
编辑: 基于反馈,我已经移动了super.prepare,但仍然没有设置userRef。
第二次编辑: 按照paulvs的建议,我删除了我的按钮segue。但是,我确实需要创建另一个将视图控制器连接到视图控制器的segue,如SO question。
答案 0 :(得分:1)
将调用放在功能结束时的super.prepare
。否则,在设置变量之前执行segue。