Viewcontroller
에 JSQMessagesViewController
을 사용했습니다. 채팅은 익명의 사용자와 함께 열립니다. 채팅은 정상적으로 작동하지만 데이터베이스에 약간의 변경이 필요합니다. 데이터베이스가 그것을위한 기반이기 때문에. 내가 메시지를 데이터베이스에 표시 할 때 데이터베이스에 자식을 만듭니다. 먼저 "메시지"라는 이름의 자식을 표시하고 메시지 아래에 채팅의 모든 메시지가 표시됩니다.이 자식을 제거하려면 직접 채팅을해야합니다. 그것이 데이터베이스에 들어갈 때 표시되어야하며 또한 모든 메시지를 데이터베이스의 간섭없이 직접 표시해야합니다. 내 코드는 UI에 메시지를 표시하기위한JSQMessages ViewController 데이터베이스에 자식을 만들지 않고 채팅
override func didPressSend(_ button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: Date!) {
let itemRef = messageRef.childByAutoId()
let messageItem = [
"senderId": senderId!,
"senderName": senderDisplayName!,
"text": text!,
]
itemRef.setValue(messageItem)
JSQSystemSoundPlayer.jsq_playMessageSentSound()
collectionView.reloadData()
finishSendingMessage()
}
이입니다,
import UIKit
import Firebase
import FirebaseDatabase
@objc class ChatViewViewController: JSQMessagesViewController, UINavigationControllerDelegate{
var ref: DatabaseReference!
var Name : String?
private var messages = [JSQMessage]()
lazy var messageRef = Database.database().reference().child("Message")
var newMessageRefHandle: DatabaseHandle?
lazy var outgoingBubbleImageView: JSQMessagesBubbleImage = self.setupOutgoingBubble()
lazy var incomingBubbleImageView: JSQMessagesBubbleImage = self.setupIncomingBubble()
private var updatedMessageRefHandle: DatabaseHandle?
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Chat Room"
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(addTapped))
self.ref = Database.database().reference(fromURL: "Database URL")
guard let str = UserDefaults.standard.string(forKey: "name") else {
return
}
senderDisplayName = str
self.senderId = Auth.auth().currentUser?.uid as NSString?! as String!
collectionView!.collectionViewLayout.incomingAvatarViewSize = CGSize.zero
collectionView!.collectionViewLayout.outgoingAvatarViewSize = CGSize.zero
observeMessages()
// Do any additional setup after loading the view.
}
보내기 버튼 코드는 이것이다, 채팅이 있습니다
private func observeMessages() {
//messageRef = channelRef!.child("messages")
// 1.
let messageQuery = messageRef.queryLimited(toLast:25)
// 2. We can use the observe method to listen for new
// messages being written to the Firebase DB
newMessageRefHandle = messageQuery.observe(.childAdded, with: { (snapshot) -> Void in
// 3
let messageData = snapshot.value as! Dictionary<String, String>
if let id = messageData["senderId"] as String!, let name = messageData["senderName"] as String!, let text = messageData["text"] as String!, text.characters.count > 0 {
// 4
self.addMessage(withId: id, name: name, text: text)
// 5
self.finishReceivingMessage()
}
})
updatedMessageRefHandle = messageRef.observe(.childChanged, with: { (snapshot) in
})
}
하지만이 때 내 보내기 버튼 코드를 보내면 방해가됩니다. @Daniel Lernard – siddle
'방해 받기 '란 무엇을 의미합니까? –
didburbutton 메서드에서 childbyAutoID를 제거하면 오류가 표시됩니다. @ 다니엘 레오나드 – siddle