Ich erstelle eine Chat-App und ich habe eine Liste aller Nachrichten, die zwischen zwei Benutzern in einer Tabellenansichtszelle gesendet werden. Zum Beispiel habe ich vier Texte insgesamt zwischen den zwei Benutzern und so habe ich vier Zellen. Allerdings möchte ich die Zellen so gruppieren, dass ich nur eine Zelle habe, weil ich mit dem loggedInUser nur mit einer Person kommuniziere. Egal was ich mache, die Nachrichten werden nicht angehängt.Firebase-Chatnachrichten anhängen
func loadData(){
if (FIRAuth.auth()?.currentUser) != nil{
FIRDatabase.database().reference().child("messages").observeSingleEvent(of: .value, with: { (snapshot:FIRDataSnapshot) in
let loggedInUserData = snapshot
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]
if let receiver = info["ReceiverId"] {
print("\(id): \(receiver)")
self.messages.Array(value)
}
}
self.MessageTableView.reloadData()
}
}})}
}
Wie jetzt meiner App-Nachrichten zwischen zwei Benutzern wie folgt dargestellt:
ich glaube, das Thema in der self.messages.Array(value)
ist, ich muss nur Nachrichten zwischen den gleichen zwei Benutzer anhängen, aber ich kann‘ t finden sie den richtigen Code
Aber ich würde für ein Gespräch zwischen zwei Benutzern wie in einer Zelle zu sein (append it)
Dies ist, was meine Zelle aussieht :
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell", for: indexPath) as! MessageTableViewCell
//Configure the cell
print(messages[indexPath.row])
let message = self.messages[indexPath.row] as! [String: AnyObject]
if let seconds = message["timestamp"] as? Double {
let timeStampDate = NSDate(timeIntervalSince1970: seconds)
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "hh:mm a"
cell.Time.text = dateFormatter.string(from: timeStampDate as Date)
}
cell.Message.text = message["text"] as? String
// cell.SellerName.text = message["ReceiverId"] as? String
if let imageName = message["ReceiverId"] as? String {
let ref = FIRDatabase.database().reference().child("posts").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 {
cell.SellerName.text = messages["username"] as? String
if (messages["uid"] as? String) != nil {
let uidPoster = messages["uid"] as? String
let imageRef = FIRStorage.storage().reference().child((uidPoster)!+"/profile_pic.jpg")
imageRef.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in
if error == nil {
let image = UIImage(data: data!)
cell.UserPic.image = image
cell.UserPic.layer.cornerRadius = 30
cell.UserPic.clipsToBounds = true
}else {
print("Error downloading image:")
}})}
self.messages.add(value)
}
}
}
})
}
return cell
}
mein Weg zu Feuerbasis Nachricht ist:....
FIRDatabase.database() Referenz() Kind ("Nachrichten") Kind ("! (Self.convoId)") childByAutoId ()
Hier ist meine Datenbankstruktur:
Offtopic, aber warum würden Sie ein einzelnes Ereignis beobachten und nicht Kind hinzugefügt?Auf diese Weise werden alle alten und neuen Nachrichten heruntergeladen. –
@ J.Doe es funktioniert gut. Ich habe kein Problem mit den alten und neuen Nachrichten heruntergeladen werden – juelizabeth
Bitte erklären Sie etwas. Sie möchten, wie wenn ich 4 Nachrichten in der Reihenfolge sende, sollten sie sich anfügen, um nur eine Zelle zu sein? –