2017-11-17 13 views
2

私はViewcontrollerJSQMessagesViewControllerを使用しました。匿名ユーザーとチャットが開きます。チャットは正常に動作していますが、データベースに変更が必要です。データベースはそのためのベースです。メッセージが表示されたデータベースに移動したときにデータベースに子を作成しています。まず「メッセージ」という名前の子を表示し、メッセージの下にチャットのすべてのメッセージが表示されます。この子を削除したい、チャットを直接行いますそれがデータベースに入るときに表示されるべきであり、また、データベース内の子供の干渉なしに直接すべてのメッセージを救済すべきである。私のコードはJSQMessages ViewControllerデータベースに子を作成せずにチャットする

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. 

} 

送信ボタンのコードはこれです、UI内のメッセージを表示するための

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() 


} 

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

しかし、私はこれを行うときに私の送信ボタンのコードを送信する邪魔をする。 @ダニエル・ルナール – siddle

+0

「邪魔する」とはどういう意味ですか? –

+0

didburbuttonメソッドでchildbyAutoIDを削除すると、エラーが表示されます。 @ダニエル・レナード – siddle

関連する問題