Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 显示在错误一侧且大小/内容不正确的消息(MessageKit)_Ios_Swift_Uicollectionview_Messagekit - Fatal编程技术网

Ios 显示在错误一侧且大小/内容不正确的消息(MessageKit)

Ios 显示在错误一侧且大小/内容不正确的消息(MessageKit),ios,swift,uicollectionview,messagekit,Ios,Swift,Uicollectionview,Messagekit,我正在开发的应用程序中使用MessageKit作为聊天功能,在messagescolectionview中插入部分时遇到了一个奇怪的布局错误。打开对话时,线程从缓存中正确加载,但当加载下一页消息(数据源已分页)并在批更新中将消息添加到UICollectionView(请参见下面的代码)时,消息会出错,出现在错误的索引中,大小错误,位于错误的一侧,偶尔也会用错误的文字 我尝试过改变我添加消息的方式,但我尝试过的所有方式都导致了这一点。。。以前版本的应用程序通过reloadData()完全重新加载了

我正在开发的应用程序中使用
MessageKit
作为聊天功能,在
messagescolectionview
中插入部分时遇到了一个奇怪的布局错误。打开对话时,线程从缓存中正确加载,但当加载下一页消息(数据源已分页)并在批更新中将消息添加到
UICollectionView
(请参见下面的代码)时,消息会出错,出现在错误的索引中,大小错误,位于错误的一侧,偶尔也会用错误的文字

我尝试过改变我添加消息的方式,但我尝试过的所有方式都导致了这一点。。。以前版本的应用程序通过
reloadData()
完全重新加载了
messagescolectionview
,但即使使用了该实现,这个错误还是在第一次打开线程时发生的(似乎只有当数据源被重新加载并且集合视图被一直滚动到底部时,我对
MessageKit
UICollectionView
的了解还不够,所以我希望能够更好地理解它们的复杂性的人能够发现错误

//
//ThreadDetailViewController.swift
//  --
//
//由Jai Smith于19年7月18日创建。
//版权所有©2019--。保留所有权利。
//
导入UIKit
导入MessageKit
导入InputBarAccessoryView
进口阿拉莫菲尔
导入操作系统日志
进口翠鸟
类ThreadDetailViewController:MessagesViewController{
//马克:财产
var线程:MessageThread!
var消息:Int=0
变量到达端:Bool=false
var loadLock:Bool=false
页面管理器?
var scrollingUp:Bool=false
var shouldFetchNextPage:Bool=false
var messagesToAdd:Int?
var insertingSections:Bool=false
//标记:覆盖
重写func viewDidLoad(){
super.viewDidLoad()
//定名
self.title=thread.title
//添加通知观察员
NotificationCenter.default.addObserver(self,selector:#selector(receivedMessage),name:Notification.name(“receivedMessage”),object:nil)
NotificationCenter.default.addObserver(self,selector:#selector(socketStateChanged),name:Notification.name(“sockState”),object:nil)
//键入时滚动到底部
self.scrollsToBottomOnKeyboardBeginsEditing=true
//设置委托/源
messagesCollectionView.messagesDisplayDelegate=self
messagesCollectionView.messagesDataSource=self
messagesCollectionView.messagesLayoutDelegate=self
messagesCollectionView.contentInset=UIEdgeInSet(顶部:2.5,左侧:0,底部:2.5,右侧:0)
messageInputBar=CustomInputBar()
messageInputBar.delegate=self
}
重写func viewdilayoutsubviews(){
super.viewDidLayoutSubviews()
//开始一直滚动到已加载消息的底部
messages=thread.messages.count
messagesCollectionView.reloadData()
messagesCollectionView.scrollToBottom(动画:false)
//加载消息
self.loadMessages()
}
重写func collectionView(collectionView:UICollectionView,willDisplay单元格:UICollectionViewCell,forItemAt indexPath:indexPath){
如果indexath.section==0,则让amount=messagesToAdd{
动画消息插入(金额:金额)
self.messagesToAdd=nil
}
}
//MARK:UIScrollViewDelegate
func scrollViewDidScroll(scrollView:UIScrollView){
scrollingUp=scrollView.PangestureRecognitor.translation(在:scrollView.superview.y中)。y>0
}
//标记:导航
覆盖功能准备(对于segue:UIStoryboardSegue,发送方:有吗?){
超级。准备(收件人:segue,发件人:发件人)
开关序列标识符{
案例“ProfileDetail”:
如果让profileTableViewController=segue.destination作为?profileTableViewController{
profileTableViewController.user=getConversants()。首先
}
违约:
fatalError(“意外的Segue标识符:\(Segue.Identifier???“nil”))
}
}
//标记:公共方法
@objc func socketStateChanged(uu通知:通知){
如果let status=notification.object as?Int{
如果状态==0{
os_日志(“连接…”,日志:OSLog.default,类型:。调试)
}如果状态==1,则为else{
//如果输入了文本,则启用发送按钮
if!self.messageInputBar.inputTextView.text.isEmpty{
self.messageInputBar.sendButton.isEnabled=true
}
}
}
}
@objc func接收消息(uu通知:通知){
如果let message=notification.object as?消息{
self.thread.messages.append(消息)
self.messages+=1
self.messagescolectionview.insertSections([self.thread.messages.count-1])
self.messagesCollectionView.scrollToBottom(动画:true)
}
}
@objc func loadMessages(){
//锁定(防止此方法被调用两次)
self.loadLock=true
Credentials.shared.session.request(API.shared.messaging.history,方法:.get,参数:[“hash”:thread.hash],编码:URLEncoding.default)
.验证(状态代码:[200])
.validate(contentType:[“application/json”])
.responseJSON{中的响应
推迟{
//解锁
self.loadLock=false
如果self.shouldFetchNextPage{
self.loadMoreMessages()
}
}
开关响应。结果{
成功案例:
guard let data=response.data,let page=try?JSONDecoder().decode(PageManager.self,f