首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSQMessagesViewController和Firebase

JSQMessagesViewController和Firebase
EN

Stack Overflow用户
提问于 2016-11-15 21:08:55
回答 2查看 692关注 0票数 2

我正在使用FirebaseJSQMessagesViewcontroller。我添加了一些消息来测试,但是没有出现。有人能帮我看看我错过了什么吗?谢谢!

我的守则:

代码语言:javascript
复制
import UIKit
import Firebase
import JSQMessagesViewController

class ChatViewController: JSQMessagesViewController {

var messages = [JSQMessage]()

lazy var outgoingBubbleImageView:JSQMessagesBubbleImage = self.setupOutgoingBubble()
lazy var incomingBubbleimageView:JSQMessagesBubbleImage = self.setupIncomingBubble()


override func viewDidLoad() {
    super.viewDidLoad()

    self.senderDisplayName = "cindy"
    self.senderId = FIRAuth.auth()?.currentUser?.uid

    print("sender id is: \(self.senderId)")
}

override func viewDidAppear(_ animated: Bool) {

    addMessage(withId: "john", name: "doo", text: "hello, I am here")

    addMessage(withId: senderId, name: "Me", text: "how are you")

    addMessage(withId: senderId, name: "Me", text: "i am earlier than you.")

   // I added finishReceivingMessage() here, but the app crashed.

}

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return messages.count
}

override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageDataForItemAt indexPath: IndexPath!) -> JSQMessageData! {

    return messages[indexPath.item]
}

override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAt indexPath: IndexPath!) -> JSQMessageBubbleImageDataSource! {

    let message = messages[indexPath.item]

    if message.senderId == senderId {

        return outgoingBubbleImageView
    } else {

        return incomingBubbleimageView
    }
}

func addMessage(withId id:String, name: String, text:String) {

    if let message = JSQMessage(senderId: id, displayName: name, text: text) {

        self.messages.append(message)

    }

}

func setupOutgoingBubble() -> JSQMessagesBubbleImage {

    let bubbleImagesFactory = JSQMessagesBubbleImageFactory()

    return (bubbleImagesFactory?.outgoingMessagesBubbleImage(with: UIColor.jsq_messageBubbleBlue()))!

}

func setupIncomingBubble() -> JSQMessagesBubbleImage {

    let bubbleImagesFactory = JSQMessagesBubbleImageFactory()

    return (bubbleImagesFactory?.incomingMessagesBubbleImage(with: UIColor.jsq_messageBubbleLightGray()))!
 }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-17 21:06:06

因此,首先,我建议您检查一下Develop分支的JSQMessagesVeiwController,并提取包含在其中的SwiftExample。这是最新版本,已经为swift3进行了更新。那我就把你的问题隔离开来。由于您实际上是在本地生成消息,而不是利用firebase,所以我会将其注释掉。

然后我们就可以像他们在DemoConversation.swift文件中做的那样让你的假对话

代码语言:javascript
复制
let message = JSQMessage(senderId: "john", displayName: "doo", text: "hello, I am here")
let message2 = JSQMessage(senderId: "asdf", displayName: "Me", text: "how are you")
let message3 = JSQMessage(senderId: "asdf", displayName: "Me", text: "i am earlier than you.")


func makeNormalConversation() -> [JSQMessage] {
  conversation = [message, message2, message3]
  return conversation
}

然后,您只需要确保所有设置都可以查看,并将消息设置为makeNormalConversation()

然后,对于您的ChatViewController,最低代码量如下:

代码语言:javascript
复制
//
//  ChatViewController.swift
//  SwiftExample
//
//  Created by Dan Leonard on 5/11/16.
//  Copyright © 2016 MacMeDan. All rights reserved.
//

import UIKit
import JSQMessagesViewController

class ChatViewController: JSQMessagesViewController {
  var messages = [JSQMessage]()
  let defaults = UserDefaults.standard
  var conversation: Conversation = makeConversation() // Here is where your messages are added.
  var incomingBubble: JSQMessagesBubbleImage!
  var outgoingBubble: JSQMessagesBubbleImage!
  fileprivate var displayName: String!

  override func viewDidLoad() {
    super.viewDidLoad()
        incomingBubble = JSQMessagesBubbleImageFactory().incomingMessagesBubbleImage(with: UIColor.jsq_messageBubbleBlue())
        outgoingBubble = JSQMessagesBubbleImageFactory().outgoingMessagesBubbleImage(with: UIColor.lightGray)

        collectionView?.collectionViewLayout.incomingAvatarViewSize = .zero
        collectionView?.collectionViewLayout.outgoingAvatarViewSize = .zero

    automaticallyScrollsToMostRecentMessage = true

    self.collectionView?.reloadData()
    self.collectionView?.layoutIfNeeded()
  }


  // MARK: JSQMessagesViewController method overrides
  override func didPressSend(_ button: UIButton, withMessageText text: String, senderId: String, senderDisplayName: String, date: Date) {
    let message = JSQMessage(senderId: senderId, senderDisplayName: senderDisplayName, date: date, text: text)
    self.messages.append(message)
    self.finishSendingMessage(animated: true)
  }

  // MARK: JSQMessages CollectionView DataSource

  override func senderId() -> String {
    return "Cindy"
  }

  override func senderDisplayName() -> String {
    return "Cindy Lue"
  }

  override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return messages.count
  }

  override func collectionView(_ collectionView: JSQMessagesCollectionView, messageDataForItemAt indexPath: IndexPath) -> JSQMessageData {
    return messages[indexPath.item]
  }

  override func collectionView(_ collectionView: JSQMessagesCollectionView, messageBubbleImageDataForItemAt indexPath: IndexPath) -> JSQMessageBubbleImageDataSource {

    return messages[indexPath.item].senderId == self.senderId() ? outgoingBubble : incomingBubble
  }

}

查看开发分支的示例项目,了解更多细节,并让我知道您是否有更多的问题?

然后从现在开始,您应该添加Firebase。您在senderID的正确路径上,只需确保您确实为已登录的用户获得一个唯一的id,然后确保该用户发送的消息的ID是相同的。

祝好运

票数 2
EN

Stack Overflow用户

发布于 2016-11-16 00:19:55

必须在添加所有示例消息之后添加finishReceivingMessage()。这有点像一个tableView.reloadData(),除了JSQMessagesViewController。它还滚动到最新的信息,为您。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40619720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档