首页 > 解决方案 > UICollectionView 不会滚动到项目(在:IndexPath,在:位置)

问题描述

我正在使用这种方法来滚动我的收藏视图。

import UIKit
extension UICollectionView {
    func scrollToLast() {
        guard numberOfSections > 0 else {
            print("number of sections < 0")
            return
        }
        let lastSection = numberOfSections - 1
        guard numberOfItems(inSection: lastSection) > 0 else {
            print("number of items < 0")
            return
        }
        let lastItemIndexPath = IndexPath(item: numberOfItems(inSection: lastSection) - 1,
                                          section: lastSection)
        self.scrollToItem(at: lastItemIndexPath, at: .centeredVertically, animated: true)
        print("last Item (section, item #): \(lastItemIndexPath)")
    }
}

在视图加载并且集合视图中有项目之前,我不会调用此方法。之前它一直在工作,直到我向单元格原型添加了一个标签,现在虽然视图看起来与新标签一样,但使用此方法不会滚动任何内容。我仍然可以手动滚动视图。注意:上述方法的输出正确地列出了调用该方法时最后一个 indexPath 的最后一项。

我在控制台中有以下警告/错误,但它似乎与调用滚动时不一致,所以不确定它是否相关:

2019-11-04 06:01:13.017384-0800 AppName[17598:4494554] [CollectionView] 在 prepareLayout 调用(即重入调用)已在进行时准备布局的尝试已被忽略。请提交一个错误。UICollectionView 实例为 (; layer = ; contentOffset: {0, 0}; contentSize: {0, 0};adjustedContentInset: {0, 0, 0, 0}; layout: ; dataSource: appBundle.instance

我如何称呼它的一个例子:(这是在 viewDidLoad 中)

DataService.instance.messageListener(roomId: room.id, { (result) in
        self.messageArr.append(result)
        self.messageArr = self.messageArr.sorted(by: { $0.date < $1.date})
        self.collection.reloadData()
        self.collection.scrollToLast()
        self.messageTextArea.text = ""
})

编辑:我已经删除了对主队列的所有调用,并且行为已经改变。当 messageListener 方法被触发时,视图现在将滚动到集合视图的顶部,但是当在scrollToLast()其他地方使用相同的方法时,视图会滚动到它应该的最后一项 - 但只有视图手动滚动到底部之后。我也尝试将代码移动到viewDidAppear下面的答案,但没有效果。

标签: iosswiftuicollectionview

解决方案


调用时viewDidLoad,将加载所有视图,但我发现集合视图和表视图不一定已加载所有数据。尝试调用您的滚动方法viewWillAppearviewDidAppear代替。


推荐阅读