未调用 Messagekit 消息数据源委托

Message Kit Message DataSoure Delegates not called

使用旧版本的 MessageKit,我对库进行了一些更改以消除由于它是用旧 Swift 版本编写的错误。

我将Chat App集成到我自己的项目中,但是点击发送按钮时消息文本没有离开消息输入栏。

Message.Swift 文件:

struct Message: MessageType {

 let id: String?
 let content: String
 let sentDate: Date
 let sender: SenderType

 var kind: MessageKind {
  if let image = image {
    return .photo(image as! MediaItem)
 } else {
  return .text(content)
 }
}

var messageId: String {
  return id ?? UUID().uuidString
}

var image: UIImage? = nil
var downloadURL: URL? = nil

init(user: User, content: String) {
  sender = Sender(id: user.uid, displayName: AppSettings.displayName)
  self.content = content
  sentDate = Date()
  id = nil
}

init(user: User, image: UIImage) {
  sender = Sender(id: user.uid, displayName: AppSettings.displayName)
  self.image = image
  content = ""
  sentDate = Date()
  id = nil
 }

 init?(document: QueryDocumentSnapshot) {
  let data = document.data()

  guard let sentDate = data["created"] as? Date else {
  return nil
 }
 guard let senderID = data["senderID"] as? String else {
  return nil
}
guard let senderName = data["senderName"] as? String else {
  return nil
}

id = document.documentID

self.sentDate = sentDate
sender = Sender(id: senderID, displayName: senderName)

if let content = data["content"] as? String {
  self.content = content
  downloadURL = nil
} else if let urlString = data["url"] as? String, let url = URL(string: urlString) {
  downloadURL = url
  content = ""
} else {
  return nil
 }
}

}

extension Message: DatabaseRepresentation {

 var representation: [String : Any] {
  var rep: [String : Any] = [
    "created": sentDate,
    "senderID": sender.senderId,
    "senderName": sender.displayName
   ]

  if let url = downloadURL {
  rep["url"] = url.absoluteString
} else {
  rep["content"] = content
}

  return rep
 }

}

extension Message: Comparable {

  static func == (lhs: Message, rhs: Message) -> Bool {
  return lhs.id == rhs.id
 }

   static func < (lhs: Message, rhs: Message) -> Bool {
   return lhs.sentDate < rhs.sentDate
 }

}

聊天视图控制器:

private func save(_ message: Message) {
reference?.addDocument(data: message.representation) { error in
  if let e = error {
    print("Error sending message: \(e.localizedDescription)")
    return
  }
  
  self.messagesCollectionView.scrollToBottom()
 }
}



extension ChatViewController: MessagesLayoutDelegate {

func avatarSize(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGSize {
return .zero
 }

func footerViewSize(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGSize {
return CGSize(width: 0, height: 8)
}

func heightForLocation(message: MessageType, at indexPath: IndexPath, with maxWidth: CGFloat, in messagesCollectionView: MessagesCollectionView) -> CGFloat {

return 0
}

}


extension ChatViewController: MessagesDataSource {
func currentSender() -> SenderType {
     return Sender(id: user.uid, displayName: AppSettings.displayName)
}

func numberOfSections(in messagesCollectionView: MessagesCollectionView) -> Int {
     return messages.count
}

func numberOfMessages(in messagesCollectionView: MessagesCollectionView) -> Int {
    return messages.count
}


func messageForItem(at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageType {
return messages[indexPath.section]
}

func cellTopLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? {
let name = message.sender.displayName
return NSAttributedString(
  string: name,
  attributes: [
    .font: UIFont.preferredFont(forTextStyle: .caption1),
    .foregroundColor: UIColor(white: 0.3, alpha: 1)
  ]
)
 }

}


extension ChatViewController: MessageInputBarDelegate {

  func messageInputBar(_ inputBar: MessageInputBar, didPressSendButtonWith text: String) {
  let message = Message(user: user, content: text)

  save(message)
  inputBar.inputTextView.text = ""
}

我的 viewDidLoad():

override func viewDidLoad() {
super.viewDidLoad()

guard let id = channel.id else {
  navigationController?.popViewController(animated: true)
  return
}

reference = db.collection(["channels", id, "thread"].joined(separator: "/"))

messageListener = reference?.addSnapshotListener { querySnapshot, error in
  guard let snapshot = querySnapshot else {
    print("Error listening for channel updates: \(error?.localizedDescription ?? "No error")")
    return
  }
  
  snapshot.documentChanges.forEach { change in
    self.handleDocumentChange(change)
  }
}

  messageInputBar.delegate = self
  messagesCollectionView.messagesDataSource = self
  messagesCollectionView.messagesLayoutDelegate = self
  messagesCollectionView.messagesDisplayDelegate = self
}

您的 pod 或 carthage 文件似乎使用了最新版本的 messageKit,例如“3.0.0”。因此,委托有一些变化。 尝试更改此和平代码:

extension ChatViewController: MessageInputBarDelegate {

  func messageInputBar(_ inputBar: MessageInputBar, didPressSendButtonWith text: String) {
    let message = Message(user: user, content: text)

    save(message)
    inputBar.inputTextView.text = ""
}

代码如下

extension ChatViewController: MessageInputBarDelegate {
  func inputBar(_ inputBar: MessageInputBar, didPressSendButtonWith text: String) {

    let message = Message(user: user, content: text)

    save(message)
    inputBar.inputTextView.text = ""
  }
}

如果您想使用旧语法,请在您的 pod 或 carthage 文件中将 messageKit 版本设置为旧版本。