2017-03-03 1 views
0

Ich mache eine Chat-App. Im Moment kann jeder Chat-Beitrag nur von dem Nutzer gesehen werden, der ihn gepostet hat. Wie mache ich die Tabellenansicht dauerhaft und für alle Benutzer nicht nur den aktuellen Benutzer sehen. Wie ein Live-Feed.Simulator und iOS-Gerät tableView Firebase

exaple von dem, was ich brauche auf allen Geräten zu zeigen, nicht nur das Testgerät:

1

import UIKit 
import Foundation 
import Firebase 
import FirebaseDatabase 
import FirebaseStorage 

struct postStruct { 
    let username : String! 
    let message : String! 
    let photoURL : String! 
} 

class GeneralChatroom: UIViewController, UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate { 

    @IBOutlet weak var messageTextField: UITextField! 

    var generalRoomDataArr = [postStruct]() 

    @IBOutlet weak var tableView: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.rowHeight = UITableViewAutomaticDimension 
     tableView.estimatedRowHeight = 140 



     let ref = FIRDatabase.database().reference() 
     let userID = FIRAuth.auth()?.currentUser?.uid 




     ref.child("general_room").child("chat").child(userID!).queryOrderedByKey().observe(.childAdded, with: {snapshot in 

      let snapDict = snapshot.value as? NSDictionary 
      let username = snapDict?["Username"] as? String ?? "" 
      let message = snapDict?["Message"] as? String ?? "" 
      let firebaseUserPhotoURL = snapDict?["photo_url"] as? String ?? "" 

      self.generalRoomDataArr.insert(postStruct(username: username, message: message, photoURL: firebaseUserPhotoURL), at: 0) 
      self.tableView.reloadData() 

     }) 

    } 



    @IBAction func backButtonPressed(_ sender: UIButton) { 
     self.performSegue(withIdentifier: "BackToRoom", sender: nil) 
    } 










    //Message Send button is pressed data uploaded to firebase 
    @IBAction func sendButtonPressed(_ sender: UIButton) { 

     let message : String = self.messageTextField.text! 

     UploadGeneralChatRoom(message: message) //upload to general_room 

     self.messageTextField.text = nil 
     messageTextField.resignFirstResponder()//Quit keyboard 
     self.tableView.reloadData() //Reload tableView 
     //UploadUserData() //Update Rank in database 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return generalRoomDataArr.count // your number of cell here 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCell(withIdentifier: "cell") 



     let usernameLabel = cell?.viewWithTag(1) as! UILabel 
     usernameLabel.text = generalRoomDataArr[indexPath.row].username 

     let messageLabel = cell?.viewWithTag(2) as! UILabel 
     messageLabel.numberOfLines=0 // line wrap 
     messageLabel.lineBreakMode = NSLineBreakMode.byWordWrapping 
     messageLabel.text = generalRoomDataArr[indexPath.row].message 



     //initialize UI Profile Image 
     let imageView = cell?.viewWithTag(3) as! UIImageView 

     //Make Porfile Image Cirlce 
     imageView.layer.cornerRadius = imageView.frame.size.width/2 
     imageView.clipsToBounds = true 

     //User Profile image in tableview 
     if generalRoomDataArr[indexPath.row].photoURL != nil 
     { 
      //let imageView = cell?.viewWithTag(3) as! UIImageView 

      if let url = NSURL(string: generalRoomDataArr[indexPath.row].photoURL) { 

       if let data = NSData(contentsOf: url as URL) { 

        imageView.image = UIImage(data: data as Data) 
       } 
      } 
     } 







     // your cell coding 
     return cell! 
    } 


}//END CLASS 
+0

Simulatoren können keine Benachrichtigungen empfangen. Testen Sie Ihre App auf zwei echten Geräten. – Adeel

+0

Verwenden Sie Socket oder REST? – chengsam

+0

Vielleicht brauche ich eine bessere Erkundung. Wenn ich eine Nachricht sende und sie an das UITableView weiterschreibe, halte ich es dauerhaft dort. Es wird also niemals verschwinden, wenn jemand im Chatroom posten wird. – nil

Antwort

0

diesen Code versuchen - Obj-C

[[[self.reference child:@"general_room"] child:@"chat"] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) { 

    if (snapshot.value != (id)[NSNull null]) { 

     NSArray *value = [snapshot.value allValues]; 

     NSLog(@"%@", [value valueForKey:@"Username"]); 
     NSLog(@"%@", [value valueForKey:@"Message"]); 
     NSLog(@"%@", [value valueForKey:@"photo_url"]); 
    } 

} withCancelBlock:^(NSError * _Nonnull error) { 
    NSLog(@"%@", error.localizedDescription); 
}]; 

In schnellen

Überprüfen Sie mit Syntax bin nicht sicher über schnelle Syntax

ref.child("general_room").child("chat").observeSingleEvent(of: .value, with: { (snapshot) in 

    let value = snapshot.value as? NSArray 

    for (dict in value) { 
    let username = dict?["Username"] as? String 
    let message = dict?["Message"] as? String 
    let photo_url = dict?["photo_url"] as? String 

     print(username) 
     print(message) 
     print(photo_url) 

    } 
    }) { (error) in 
     print(error.localizedDescription) 
    }} 
Verwandte Themen