0
私はこの質問のために自分のコードをわずか12行に減らしました。私はfetchedResultsControllerをjsqMessagesViewControllerフレームワークにリンクしました。コレクションに1つのアイテムを挿入すると、collectionView内に1つのアイテムがすべてリロードされます
送信ボタンを押すとオブジェクトがコンテキストに挿入され、fetchedResultsControllerの.Insert
がアクティブになります。
何らかの理由で、コレクションビューに挿入するたびに、コレクションビュー内のすべてのものがリロードされます。これはたくさんのバグを引き起こしています.JSQフレームワーク自体が間違っているのか、それとも正常であるのかは分かりません。
とにかく、ここに私のコード全体があります。長いことではなく、使い慣れたコードデータを素早く手に入れることができれば、これは読みやすい風でなければなりません。
class ChatController: JSQMessagesViewController, NSFetchedResultsControllerDelegate {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
lazy var fetchedResultsControler: NSFetchedResultsController<NSFetchRequestResult> = {
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Message")
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "timestamp", ascending: true)]
let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.context, sectionNameKeyPath: nil, cacheName: nil)
frc.delegate = self
return frc
}()
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
if type == .insert {
collectionView.insertItems(at: [newIndexPath!])
scrollToBottom(animated: true)
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.senderId = ""
self.senderDisplayName = ""
do {
try fetchedResultsControler.performFetch()
}
catch { }
}
override func didPressSend(_ button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: Date!) {
let message = NSEntityDescription.insertNewObject(forEntityName: "Message", into: context) as! Message
message.text = text
message.timestamp = Date() as NSDate?
}
override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageDataForItemAt indexPath: IndexPath!) -> JSQMessageData! {
let msg : Message = fetchedResultsControler.object(at: indexPath) as! Message
let messageData = JSQMessage(senderId: senderId, displayName: senderDisplayName, text: msg.text)
return messageData
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return (fetchedResultsControler.sections?[0].numberOfObjects)!
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = super.collectionView(collectionView, cellForItemAt: indexPath) as! JSQMessagesCollectionViewCell
cell.layer.shouldRasterize = true
cell.layer.rasterizationScale = UIScreen.main.scale
return cell
}
override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAt indexPath: IndexPath!) -> JSQMessageBubbleImageDataSource! {
let bubbleFactory = JSQMessagesBubbleImageFactory()
return bubbleFactory?.outgoingMessagesBubbleImage(with: .black)
}
override func collectionView(_ collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAt indexPath: IndexPath!) -> JSQMessageAvatarImageDataSource! {
return nil
}
}
こんにちはDeepak、私の問題は、一度に1つのことをリロードしたいのではありません。実際、私は何かをリロードしたくない。しかし何らかの理由で、コレクションにアイテムを挿入すると、コレクションビューの他のすべてのアイテムがリロードされます。私が知っていることは起こっているべきことではありません。 – slimboy