사용자가 대화를 할 때 대화를 tableViewController에 표시하고자합니다. 예를 들어, User1이 User2에 10 개의 메시지를 보내는 경우 User1 - User2 대화에서 보낸 마지막 메시지를 표시하는 TableView에 하나의 셀이 있어야합니다. User1이 User3에 4 개의 메시지를 보내면 User1은 두 개의 tableView 셀을 가져야하고 User2와 User3은 하나의 메시지 만 가져야합니다. 내 데이터베이스는 다음과 같습니다firebase에서 사용자 메시지 가져 오기
나는 모든 메시지를 검색하고 messagesViewController에서 그들을 볼 수 아래의 기능을 사용하고messages
hx1DXeMFRU
-KkVUFuhv7xsYVhnjldV
ReceiverId: "hx1DX1hW5JZMSmDjwQRUYo3i5Yt2"
senderId: "eMFRUhfmckTq9cRWNnwIc9mqxxv1"
text:"hey"
convoId: hx1DXeMFRU
timestamp: 1495193736.860723
-KkVUJG8VPOijCvzMKRf
ReceiverId: "eMFRUhfmckTq9cRWNnwIc9mqxxv1"
senderId: "hx1DX1hW5JZMSmDjwQRUYo3i5Yt2"
text:"Hey how are you?"
convoId: hx1DXeMFRU
timestamp: 1495193699.448048
. 그러나 두 명의 고유 한 사용자간에 대화를 추가하려고하면 모든 메시지가 하나의 셀에 추가됩니다. 따라서 구체적인 예제에서 User1과 User2, User1이 User3과 통신하는 두 개의 셀이 있어야합니다.
import UIKit
import Firebase
import FirebaseStorage
import FirebaseAuth
import FBSDKCoreKit
import FBSDKLoginKit
import FirebaseDatabase
import JSQMessagesViewController
class MessagesTableViewController: UITableViewController {
var databaseRef = FIRDatabase.database().reference()
var loggedInUser = FIRAuth.auth()?.currentUser
var loggedInUserUid = FIRAuth.auth()?.currentUser?.uid
var dictDetails: [String:AnyObject]?
var messages = NSMutableArray()
var messagesArray = [String]()
var convoId: String?
var receiverData: AnyObject?
let storage = FIRStorage.storage()
var senderId = FIRAuth.auth()?.currentUser?.uid
@IBOutlet var MessageTableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.barTintColor = UIColor(red:0.23, green:0.73, blue:1.00, alpha:1.0)
self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
self.navigationItem.title = "Messages"
self.navigationItem.rightBarButtonItem?.tintColor = UIColor.white
self.navigationItem.leftBarButtonItem?.tintColor = UIColor.white
loadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func loadData()
{
let uidToFind = loggedInUserUid as String!
FIRDatabase.database().reference().child("messages")
.queryOrdered(byChild: "ReceiverId")
.queryEqual(toValue: uidToFind).queryLimited(toLast: 1)
.observe(.childAdded, with: { snapshot in
let msgDict = snapshot.value as! [String: Any]
let msg = msgDict["ReceiverId"] as! String
self.messages = []
self.messages.append(msg)
self.MessageTableView.reloadData()
})
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if messages.count > 0 {
tableView.backgroundView = .none;
tableView.separatorStyle = .singleLine
return self.messages.count
}
else{
let noDataLabel: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: tableView.bounds.size.height))
noDataLabel.text = "No Messages"
noDataLabel.textColor = UIColor.lightGray
noDataLabel.textAlignment = .center
tableView.backgroundView = noDataLabel
tableView.separatorStyle = .none
return 0
}
}
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
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 {
}})}
self.messages.add(value)
}}}})}
return cell
}
}
같은
는뭔가 텍스트가 아닌 이미지와 같은 중포 기지 구조 문제를 업데이트하십시오. 이미지를 검색 할 수 없으며 대답에 사용해야하는 경우 다시 입력해야합니다. Firebase 콘솔 -> 오른쪽 3 점> JSON 내보내기를 통해 구조를 가져올 수 있습니다. – Jay
두 명의 고유 한 사용자 *간에 대화를 추가하려고 시도하는 것이 분명하지 않습니다. 너 왜 추가하는거야? 너 왜 추가하고있어? 추가되면 어떤 일이 발생해야합니까? 모든 대화를로드하는 이유는 무엇입니까? 사용자가 압도적 인 UI 경험 일 수있는 200 개가있는 경우 귀하의 질문을 명확히 해주시기 바랍니다. – Jay
User1과 User2가 대화를하면 위에 제공된 구조로 텍스트가 firebase에 전송됩니다. 이 두 사용자가 20 개의 메시지를 보내면 두 명의 사용자간에 마지막 메시지를 보내고이를 tableviewcell에 표시하고 싶습니다. User1 중 하나가 다른 사용자 3에게 4 개의 메시지를 보내는 경우 해당 사용자간에 마지막으로 보낸 메시지를 다시 가져 와서 tableview에 표시하려고합니다. 이제 user1에는 두 개의 tableview 셀이 있고 user2에는 1이 있고 User3에는 tableviewcell이 있습니다. @Jay – juelizabeth