TableView Publik Untuk semua Pengguna

Saya sedang membuat aplikasi ruang obrolan. Saat ini, ketika pengguna masuk, mereka diberikan tampilan tabel sendiri untuk mengunggah data juga.

Daripada setiap pengguna memiliki tampilan tabel pribadi masing-masing, saya ingin semua pengguna terhubung ke satu tampilan tabel (publik) sehingga semua orang dapat melihat apa yang diposting. Oleh karena itu aplikasi ruang obrolan.

  • Ini adalah 3 login terpisah dan tampilan setiap pengguna saat mereka memposting pesan:

3 Pisahkan pengguna saat masuk dan memposting ke Tampilan Tabel

  • Ini yang aku inginkan. Agar setiap sel tampilan tabel mewakili pesan berbeda dari pengguna berbeda. Semua dilihat secara publik dalam satu tampilan tabel. Bukan pada tampilan tabel terpisah:

Apa yang saya ingin tableView lakukan ketika pengguna memposting

Bagaimana cara membuat tampilan tabel menjadi publik? Ketika saya masuk sebagai pengguna yang berbeda, saya ingin pesan sebelumnya tetap ada dari setiap pengguna. Oleh karena itu ruang obrolan.

masukkan deskripsi gambar di sini

{
   "rules": {
  "Users":{
     ".read": "true",
     ".write": "true"
},
  "general_room" : {
    ".read": "true",
     ".write": "true"
  }
    }
}

Ruang Obrolan Umum.swift

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

Unggah ke firebase

import Foundation
import Firebase
import FirebaseDatabase
import FirebaseStorage

func UploadGeneralChatRoom(message : String) {

    //Firebase Initialization
    var ref: FIRDatabaseReference!
    //var storage: FIRStorageReference!
    let userID = FIRAuth.auth()?.currentUser?.uid
    ref = FIRDatabase.database().reference()
    //storage = FIRStorage.storage().reference()


    //Get Data from database resend to database
    ref.child("Users").child(userID!).observeSingleEvent(of: .value, with: {(snapshot) in

        let snapDict = snapshot.value as? NSDictionary
        let username = snapDict?["Username"] as? String ?? ""
        let firebaseUserPhotoURL = snapDict?["photo_url"] as? String ?? ""           
        ref.child("general_room").child("chat").child(userID!).childByAutoId().setValue(["Username": username, "uid": userID!, "Message" : message, "photo_url" : firebaseUserPhotoURL])

    })        
}

person nil    schedule 03.03.2017    source sumber
comment
tunjukkan kepada kami struktur firebase Anda   -  person rv7284    schedule 03.03.2017
comment
jika Anda menyimpan ruang obrolan pada anak pengguna tertentu. Anda perlu membuat anak publik dan menyimpan semua ruang obrolan di sana. Dengan cara ini semua pengguna dapat mengakses ruang obrolan tersebut.   -  person rv7284    schedule 03.03.2017
comment
Anda mungkin terlalu memperumit tugas ini: Anda memerlukan node bernama general_chat, dan saat pengguna memposting pesan ke general_chat, pesan tersebut disimpan di node tersebut sebagai anak. Semua pengguna mengamati node general_chat dan karenanya diberi tahu ketika pesan baru ditambahkan. Pada gilirannya ketika setiap klien menerima peristiwa pemberitahuan tersebut, pesan tersebut ditambahkan ke tableView klien tersebut. Ini membuat semua klien tetap tersinkronisasi sehingga mereka semua melihat pesan baru yang diposting. Setiap kali pengguna baru masuk, mereka akan mengamati node general_chat dan melihat semua postingan sebelumnya.   -  person Jay    schedule 03.03.2017
comment
Kemungkinan duplikat Simulator dan perangkat iOS tableView Firebase   -  person Jay    schedule 03.03.2017


Jawaban (1)


Saya tidak tahu bagaimana pengaturan database firebase Anda tetapi Anda memposting ke child("Users").child(userID!) tetapi membaca dari child("general_room").child("chat").child(userID!)

Anda perlu membaca dan menulis di lokasi yang sama.

Juga: coba buka nilai opsional Anda dengan aman:

if let userId = userID {
    ref.child("Users").child(userId).observeSingleEvent(of: .value, with: {(snapshot) in

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

            ref.child("general_room").child("chat").child(userID!).childByAutoId().setValue(["Username": username, "uid": userID!, "Message" : message, "photo_url" : firebaseUserPhotoURL])
     })
}
person Bob De Kort    schedule 03.03.2017
comment
Di mana Anda mendapatkan data di viewcontroller, Anda menambahkan .child(UserID!) setelah .child(chat). Jadi ketika mengambil pesan-pesan ini, Anda harus memiliki id dari semua pengguna di obrolan atau menyiapkan obrolan dengan id sehingga semua pengguna dapat mengakses ruang obrolan itu. - person Bob De Kort; 03.03.2017
comment
Bob De Kort dan @jay, saya mengerti apa yang Anda katakan, tetapi bisakah Anda menjelaskan lebih detail. Atau tunjukkan cara mengaturnya agar saya lebih memahaminya. - person nil; 05.03.2017
comment
@ rv7284 dapatkah Anda menjelaskan lebih detail. - person nil; 05.03.2017
comment
Oke: Jadi di bawah bagian obrolan Anda di database firebase, Anda memiliki grup pesan di bawah id (mis.: hvl6stvu...) ini (sejauh yang saya tahu) adalah id pengguna Anda. Anda memposting ke sini menggunakan id pengguna Anda yang login. Jadi ketika mengambil dengan id pengguna yang login, Anda hanya mendapatkan akses ke pesan pengguna tersebut. - person Bob De Kort; 06.03.2017
comment
Daripada ini: ref.child("general_room").child("chat").child(userID!).childByAutoId().setValue(["Username": username, "uid": userID!, "Message" : message, "photo_url" : firebaseUserPhotoURL]) hapus .child(UserID!) ref.child("general_room").child("chat").childByAutoId().setValue(["Username": username, "uid": userID!, "Message" : message, "photo_url" : firebaseUserPhotoURL]) - person Bob De Kort; 06.03.2017