iOS Swift使用MessageKit调用delegate和DataSource提示messagesCollectionView不在作用域
错误原因
你当前的
ChatDashboard继承的是系统原生UIViewController,本身不包含messagesCollectionView这个内置属性,该属性是MessageKit框架中MessagesViewController的专属自带成员,因此编译器会报变量找不到的作用域错误。
修复步骤
- 修改
ChatDashboard的父类继承关系,将父类从UIViewController替换为MessagesViewController,修改后的类定义代码如下:
class ChatDashboard: MessagesViewController { // 原有类内代码保持不变 @IBOutlet weak var lblUser: UILabel! var userActive: String? = nil override func viewDidLoad() { super.viewDidLoad() // 这里调用messagesCollectionView就不会报错了 messagesCollectionView.messagesDataSource = self messagesCollectionView.messagesLayoutDelegate = self messagesCollectionView.messagesDisplayDelegate = self if let userData = userActive { self.lblUser.text = userData } } }
- 修正自定义Sender结构体的命名规范,Swift要求类型名首字母大写,避免后续出现类型识别异常:
struct Sender: SenderType { var photo: String var senderId: String var displayName: String }
- 扩展
ChatDashboard遵守三个代理协议,实现必填代理方法,参考代码如下:
extension ChatDashboard: MessagesDataSource, MessagesLayoutDelegate, MessagesDisplayDelegate { // 必填:返回当前登录的消息发送方 var currentSender: SenderType { // 替换为你自己构造的当前用户Sender实例 return Sender(photo: "", senderId: Auth.auth().currentUser?.uid ?? "", displayName: "") } // 必填:返回消息总条数 func numberOfSections(in messagesCollectionView: MessagesCollectionView) -> Int { // 替换为你的消息数组的count值 return 0 } // 必填:返回对应索引位置的消息实例 func messageForItem(at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageType { // 替换为你的消息数组[indexPath.section] return Message(sender: currentSender, messageId: UUID().uuidString, sentDate: Date(), kind: .text("测试消息")) } }
- 如果你使用Storyboard搭建页面,需要将对应页面的自定义类设置为
ChatDashboard,同时确保父类匹配为MessagesViewController。
内容的提问来源于stack exchange,提问作者King faheem
相关产品推荐
相关产品推荐

