2017-11-17 10 views
2

ViewcontrollerJSQMessagesViewController을 사용했습니다. 채팅은 익명의 사용자와 함께 열립니다. 채팅은 정상적으로 작동하지만 데이터베이스에 약간의 변경이 필요합니다. 데이터베이스가 그것을위한 기반이기 때문에. 내가 메시지를 데이터베이스에 표시 할 때 데이터베이스에 자식을 만듭니다. 먼저 "메시지"라는 이름의 자식을 표시하고 메시지 아래에 채팅의 모든 메시지가 표시됩니다.이 자식을 제거하려면 직접 채팅을해야합니다. 그것이 데이터베이스에 들어갈 때 표시되어야하며 또한 모든 메시지를 데이터베이스의 간섭없이 직접 표시해야합니다. 내 코드는 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 
          }) 
} 

이 내 데이터베이스 enter image description here을 보면 어떻게

답변

0

내가 완전히 이해했는지 모르겠다. 귀하의 문제가 있지만 내가 수집 할 수있는 데이터베이스에서 Message 레이어를 제거하려고합니다. 당신은 당신의 파일

lazy var messageRef = Database.database().reference().child("Message")의 상단에이 줄을 변경하여이 작업을 수행 할 수 있어야한다 -> lazy var messageRef = Database.database().reference()

이 그 층을 제거한다. 그것이 당신이 설명하는 문제가 아니라면 알려주십시오.

+0

하지만이 때 내 보내기 버튼 코드를 보내면 방해가됩니다. @Daniel Lernard – siddle

+0

'방해 받기 '란 무엇을 의미합니까? –

+0

didburbutton 메서드에서 childbyAutoID를 제거하면 오류가 표시됩니다. @ 다니엘 레오나드 – siddle