我试图在我的iOS swift应用程序中为聊天功能实现MessageKit(JSQMessagesViewController的替换)。我遵循了raywenderlich教程。我使用Pods进行安装,并逐步遵循了本教程。我的消息正在显示。根据本教程,为了隐藏用户头像,我将viewController设置为messagesLayoutDelegate和的委托messagesDisplayDelegate。
//Inside view did load, i set the delegates, along with data source
messagesCollectionView.messagesDataSource = self
messagesCollectionView.messagesLayoutDelegate = self
messagesCollectionView.messagesDisplayDelegate = self
Run Code Online (Sandbox Code Playgroud)
但是,MessagesLayoutDelegate没有调用的委托函数。
我想隐藏用户头像,所以我在viewController中采用了协议
extension ChatLogVC_MessageKit: MessagesLayoutDelegate {
func avatarSize(for message: MessageType, at indexPath: IndexPath,
in messagesCollectionView: MessagesCollectionView) -> CGSize {
//return zero size for hiding avatar, but this function is not being called.
return .zero
}
func footerViewSize(for message: MessageType, at indexPath: IndexPath,
in messagesCollectionView: MessagesCollectionView) …Run Code Online (Sandbox Code Playgroud) 我已经阅读了在MessageKit 中创建自定义单元格的指南,以及这样的问题
我正在尝试创建一个自定义单元格;这是我的继承自 a 的单元格的代码UICollectionViewCell:
import UIKit
import MessageKit
open class ChatReferenceCell: UICollectionViewCell {
@IBOutlet weak var authorLabel: UILabel!
@IBOutlet weak var referenceText: UITextView!
@IBOutlet weak var participantsLabel: UILabel!
public override init(frame: CGRect) {
super.init(frame: frame)
setupSubviews()
}
public required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupSubviews()
}
open func setupSubviews() {
}
open override func layoutSubviews() {
super.layoutSubviews()
}
open func configure(with message: MessageType, at indexPath: IndexPath, and messagesCollectionView: MessagesCollectionView) {
// Do stuff
switch …Run Code Online (Sandbox Code Playgroud) ios uicollectionview uicollectionviewlayout swift messagekit
我正在使用 SwiftUI 构建一个应用程序,并且想使用 MessageKit,因此我使用 aUIViewControllerRepresentable来显示 MessageKit 视图。但是,当显示键盘时,消息可以滚动到视图底部。
我仍然可以向下滚动消息,但尝试将消息推UICollectionView到底部会导致同样的问题。隐藏键盘时不会出现此问题。
下面是捕获的 UI 层次结构的屏幕截图,其中隐藏了导航栏和根视图:

集合视图的大小仍然正确,但消息可以滚动到底部,并且滚动指示器位于顶部。
这是带有相关代码的根 SwiftUI 视图:
struct SingleChatView: SwiftUI.View {
@ObservedObject var chat: Chat
@State private var mkView: MessageKitView
init(chat: Chat) {
self.chat = chat
_mkView = State(initialValue: MessageKitView(chat: chat))
}
var body: some SwiftUI.View {
mkView
.navigationBarTitle(chat.name)
.uiKitOnAppear {
mkView.controller.becomeFirstResponder()
mkView.controller.messagesCollectionView.scrollToBottom(animated: true)
chat.clearNotifications()
// Set chat as active
ChatManager.shared.activeChat = chat
}
.onDisappear {
chat.setTypingStatus(to: false)
// Set chat as inactive
ChatManager.shared.activeChat = nil
} …Run Code Online (Sandbox Code Playgroud) 我刚刚将代码更新为Swift 4.2,并修复了所有错误。现在,我正在尝试使用“ MessageKit”将Messenger放入我的应用程序。一切都已更新,但我遇到了这些问题...MessagesInputBarDelegate
“使用未声明的类型'MessagesInputBarDelegate'”
和
“使用未声明的类型'MessageInputBar'”
也,
“参数标签'(类型:)'与任何可用的重载都不匹配”
和
“无法转换'_类型的值?' 预期的参数类型“ URL?”
使用未声明的类型'MessagesInputBarDelegate'
使用未声明的类型'MessageInputBar'
extension CustomerChatViewController: MessagesInputBarDelegate {
func messageInputBar(_ inputBar: MessageInputBar, didPressSendButtonWith text: String) {
let message = Message(user: user, content: text)
save(message)
inputBar.inputTextView.text = ""
}
}
Run Code Online (Sandbox Code Playgroud)
参数标签'(type :)'不匹配任何可用的重载
let cameraItem = UIBarButtonItem(type: .system)
Run Code Online (Sandbox Code Playgroud)
无法转换类型“ _”的值 预期的参数类型“ URL?”
let imageName = [UUID().uuidString, String(Date().timeIntervalSince1970)].joined()
storage.child(channelID).child(imageName).putData(data, metadata: metadata) { meta, error in
completion(meta?.downloadURL())
}
Run Code Online (Sandbox Code Playgroud) 所以这是控制器层次结构 tabBarController -> 一些控制器和聊天频道控制器。
而这个聊天频道控制器也是一个导航控制器。当我选择行时,它会推送到 MessageViewController 类的聊天控制器。
我在这里有两个问题,一个是次要的,一个是主要的。
次要的是那个分身。
func avatarSize(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGSize {
print("delegate method called")
return .zero
}
Run Code Online (Sandbox Code Playgroud)
我在其中一个代表中将其设置为零,但它仍然显示。而且它从不打印语句。
主要的一个是输入栏根本没有显示。我的 pod 文件中已经有 InputBarAccessoryView 并且
messageInputBar.delegate = self as InputBarAccessoryViewDelegate
extension ChatViewController: InputBarAccessoryViewDelegate {
func inputBar(_ inputBar: InputBarAccessoryView, didPressSendButtonWith text: String) {
print("text")
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个 Firebase 快照侦听器,用于检查新文档,将它们添加到数组(collectionView 数据源),然后重新加载 collectionView。但是,我在 collectionView 中得到了重复的单元格。我的 Firestore 集合中目前有 3 个对象,但它们被复制了总共 9 个单元格。
我什至添加了对索引的检查,因此 reloadData 仅在到达数组末尾后才会发生。这是相关的代码:
messageListener = query.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
if change.type == .added {
for document in snapshot.documents{
....
let newMessage = Message(sender: newSender, messageId: document.documentID, sentDate: date, text: text)
self.messages.append(newMessage)
guard let index = snapshot.documents.index(of: document) else {return}
if index == (snapshot.documents.count - …Run Code Online (Sandbox Code Playgroud) 最近,我一直在开发聊天应用程序,但在通过聊天异步加载图像时遇到了麻烦。
使用MessageKit-2.0
我试过了
import MessageKit
class Image: MediaItem {
var url: URL?
var image: UIImage?
var placeholderImage: UIImage
var size: CGSize
init(url: URL) {
self.url = url
self.size = CGSize(width: 240, height: 240)
self.placeholderImage = UIImage()
DispatchQueue.global().async {
if let data = try? Data(contentsOf: url) {
if let image = UIImage(data: data) {
DispatchQueue.main.async {
self.image = image
}
}
}
}
}
init(image: UIImage) {
self.image = image
self.size = CGSize(width: 240, height: 240)
self.placeholderImage = UIImage()
}
Run Code Online (Sandbox Code Playgroud)
} …
这是我第一次使用 MessageKit。我正在尝试自定义我的视图,但找不到任何有关如何执行此操作的有用信息,例如设置插图和更改背景颜色。
我想从标题栏下方启动视图并更改背景颜色和消息的背景颜色。
func backgroundColor(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> UIColor {
return isFromCurrentSender(message: message) ? UIColor.myGold : UIColor.headingGold
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激。
如何在MessageKit中发送消息时实现有关错误的信息?当消息不发送时,我需要显示信息。有任何想法吗?