我已经有登录的用户的所有邮件列表的tableviewcontroller已派出在app喜/她所选择的任何用户:火力消息意外地发现零
的信息登录的用户和任何与该应用程序的其他用户被附加和使用此代码在tableviewcell显示:
func loadData()
{
FIRDatabase.database().reference().child("messages").observeSingleEvent(of: .value, with: { (snapshot:FIRDataSnapshot) in
if let postsDictionary = snapshot .value as? [String: AnyObject] {
for post in postsDictionary {
let messages = post.value as! [String: AnyObject]
for (id, value) in messages {
let info = value as! [String: AnyObject]
let convoId = info["convoId"]
let toId = info["ReceiverId"] as! String!
let fromId = info["senderId"] as! String!
if (toId == self.loggedInUserUid || fromId == self.loggedInUserUid) {
let ref = FIRDatabase.database().reference().child("messages").child(convoId as! String)
ref.observe(.childAdded, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
let message = Message(dictionary: dictionary)
// self.messages.append(message)
if let receiver = message.convoId {
self.messagesDictionary[receiver] = message
self.messages = Array(self.messagesDictionary.values)
print(self.messages)
self.messages.sort(by: { (message1, message2) -> Bool in
return (message1.timestamp?.int32Value)! > (message2.timestamp?.int32Value)!
})
}
//this will crash because of background thread, so lets call this on dispatch_async main thread
DispatchQueue.main.async(execute: {
self.MessageTableView.reloadData()
})
}
}, withCancel: nil)}
}
}}})
}
然而,当我单击一个单元格,我想去的详细视图控制器,显示已登录的用户之间的消息和单元格的用户点击,所以我用这个代码继续:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let message = messages[indexPath.row]
if message.ReceiverId != self.loggedInUserUid {
var newVariable = message.ReceiverId
if let userpicuid = newVariable {
let ref = FIRDatabase.database().reference().child("users").child(userpicuid)
ref.observeSingleEvent(of: .value, with: { (snapshot)
in
if let dictionary = snapshot.value as? [String: AnyObject]{
for post in dictionary {
let messages = post.value as! [String: AnyObject]
for (id, value) in messages {
let username = messages["username"] as? String
self.userpicuid = userpicuid
self.username = username
}}}})}} else if message.senderId != self.loggedInUserUid {
let newVariable = message.senderId
if let userpicuid = newVariable {
let ref = FIRDatabase.database().reference().child("users").child(userpicuid)
ref.observeSingleEvent(of: .value, with: { (snapshot)
in
if let dictionary = snapshot.value as? [String: AnyObject]{
for post in dictionary {
let messages = post.value as! [String: AnyObject]
for (id, value) in messages {
let username = messages["username"] as? String
self.userpicuid = userpicuid
self.username = username
}}}})}
}
performSegue(withIdentifier: "MessageNow", sender: self)
}
override public func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard segue.identifier == "MessageNow", let chatVc = segue.destination as? SendMessageViewController else {
return
}
print(self.userpicuid)
chatVc.senderId = self.loggedInUser?.uid
chatVc.receiverData = self.userpicuid
chatVc.senderDisplayName = self.userpicuid
chatVc.username = self.username
}
然而,当我点击单元格,我得到的错误致命错误:意外发现零而展开的可选值所以我包括一些打印语句,找出其中零为。结果userpicuid和用户名返回零。我不知道我在做什么错,尤其是因为我的代码正在检查receiverId和senderId,并且其中一个不是已登录的用户的uid,那么uid应该是发送者标识符,它会继承详细的消息。
错误发生在let receiverId = receiverData!在详细信息视图控制器行:
var receiverData: String?
override func viewDidLoad() {
super.viewDidLoad()
let receiverId = receiverData!
let receiverIdFive = String(receiverId.characters.prefix(5))
let senderIdFive = String(senderId.characters.prefix(5))
if (senderIdFive > receiverIdFive)
{
self.convoId = senderIdFive + receiverIdFive
}
else
{
self.convoId = receiverIdFive + senderIdFive
}
}
你的代码在哪行中断? – KKRocks
@KKRocks我更新了问题 – juelizabeth
尝试将属性声明为** var receiverData:String?** – KKRocks