2017-06-03 22 views
0

我已经有登录的用户的所有邮件列表的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 
      } 
    } 
+0

你的代码在哪行中断? – KKRocks

+0

@KKRocks我更新了问题 – juelizabeth

+0

尝试将属性声明为** var receiverData:String?** – KKRocks

回答

0

我找到了解决问题的办法使用这个:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell", for: indexPath) as! MessageTableViewCell 


    if message.ReceiverId != self.loggedInUserUid { 
     var newVariable = message.ReceiverId 

    if let imageName = newVariable { 

     let ref = FIRDatabase.database().reference().child("users").child(imageName) 

     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 { 


         self.username = messages["username"] as? String 
         self.userpicuid = messages["uid"] as? String 


      }}}})}}else if message.senderId != self.loggedInUserUid { 
     let newVariable = message.senderId 

     if let imageName = newVariable { 

      let ref = FIRDatabase.database().reference().child("users").child(imageName) 

      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 { 

          self.username = messages["username"] as? String 
          self.userpicuid = messages["uid"] as? String 

         }}}})} 
    } 
    return cell 
} 


    override public func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     guard segue.identifier == "MessageNow", let chatVc = segue.destination as? SendMessageViewController else { 
      return 
     } 


           chatVc.senderId = self.loggedInUser?.uid 
           chatVc.receiverData = self.userpicuid 
           chatVc.senderDisplayName = self.userpicuid 
           chatVc.username = self.username 




    } 
0

尝试把此行:

performSegue(withIdentifier: "MessageNow", sender: self)

就在这里:

let username = messages["username"] as? String 
self.userpicuid = userpicuid 
self.username = username 
performSegue(withIdentifier: "MessageNow", sender: self) 
+0

它输出了超过一百个零位,并突出显示该行作为问题的根源 – juelizabeth

相关问题