菜鸟教程小白 发表于 2022-12-11 19:19:37

ios - JSQMessages ViewController 聊天而不在数据库中创建任何 child


                                            <p><p>我在 <code>Viewcontroller</code> 中使用了 <code>JSQMessagesViewController</code>。聊天以匿名用户打开。聊天工作正常,但我需要对数据库进行一些更改。因为数据库是它的火力基地。当任何消息进入它显示的数据库时,我正在我的数据库中创建一个 child ,首先它显示名为“消息”的 child ,并在消息下显示所有聊天消息,我想删除这个 child ,直接聊天应该在它进入数据库时​​显示,并且还应该直接接收所有消息,而不会干扰数据库中的任何子项。我的聊天代码是这样的,</p>

<pre><code>import UIKit
import Firebase

import FirebaseDatabase

@objc class ChatViewViewController: JSQMessagesViewController, UINavigationControllerDelegate{

var ref: DatabaseReference!
var Name : String?


private var messages = ()
lazy var messageRef = Database.database().reference().child(&#34;Message&#34;)
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 = &#34;Chat Room&#34;
    navigationItem.leftBarButtonItem = UIBarButtonItem(title: &#34;Back&#34;, style: .plain, target: self, action: #selector(addTapped))

    self.ref = Database.database().reference(fromURL: &#34;Database URL&#34;)

    guard let str = UserDefaults.standard.string(forKey: &#34;name&#34;) 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.

}
</code></pre>

<p>发送按钮代码是这个,</p>

<pre><code> override func didPressSend(_ button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: Date!) {
    let itemRef = messageRef.childByAutoId()
    let messageItem = [
      &#34;senderId&#34;: senderId!,
      &#34;senderName&#34;: senderDisplayName!,
      &#34;text&#34;: text!,
      ]

    itemRef.setValue(messageItem)

    JSQSystemSoundPlayer.jsq_playMessageSentSound()

    collectionView.reloadData()

    finishSendingMessage()


}
</code></pre>

<p>在 UI 中显示消息是这样的,</p>

<pre><code> private func observeMessages() {
    //messageRef = channelRef!.child(&#34;messages&#34;)


    // 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) -&gt; Void in
      // 3
      let messageData = snapshot.value as! Dictionary&lt;String, String&gt;

      if let id = messageData[&#34;senderId&#34;] as String!, let name = messageData[&#34;senderName&#34;] as String!, let text = messageData[&#34;text&#34;] as String!, text.characters.count &gt; 0 {
            // 4
            self.addMessage(withId: id, name: name, text: text)

            // 5
            self.finishReceivingMessage()

                }

    })

    updatedMessageRefHandle = messageRef.observe(.childChanged, with: { (snapshot) in
                        })
}
</code></pre>

<p>这就是我的数据库的外观
<a href="/image/5AA1b.png" rel="noreferrer noopener nofollow"><img src="/image/5AA1b.png" alt="enter image description here"/></a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我不知道我是否完全理解您的问题,但据我所知,您正试图从数据库中删除 <code>Message</code> 层。您应该可以通过更改文件顶部的这一行来完成此操作</p>

<p><code>lazy var messageRef = Database.database().reference().child("Message")</code> to ->
<code>lazy var messageRef = Database.database().reference()</code> </p>

<p>这将删除该层。如果这不是您所描述的问题,请告诉我。
页: [1]
查看完整版本: ios - JSQMessages ViewController 聊天而不在数据库中创建任何 child