collectionview scrollToItemAtIndexPath崩溃应用程序

时间:2016-12-26 08:24:26

标签: ios swift xcode uicollectionview swift3

所以我在viewDidLoad函数中放置了以下代码,它崩溃了应用程序。任何想法为什么会发生这种情况或解决这个问题?

SecondForm

--------------- EDIT --------------- 添加了错误日志

self.collectionView?.scrollToItem(at: IndexPath(row: 0, section: 0), at: .top, animated: true)

6 个答案:

答案 0 :(得分:4)

可能的问题

你的collectionView数据源是否有任何数据,如果它是nil,numberOfItemsInSection将返回0并且因为你要求collectionView滚动到indexPath IndexPath(row: 0, section: 0)并且因为没有单元格它可能会崩溃。

<强>解决方案

  1. 确保您的数据源不是nil或至少返回一个单元格

  2. 一旦collectView重新加载数据,
  3. 滚动到ViewDidAppear中的指定indexPath(假设在调用ViewDidAppear时你将获得一些数据)

  4. 解决方法

    在要求collectionView滚动到指定的indexPath之前,询问您的数据源是否有indexPath(0,0)的单元格

        if let _ = self.collectionView?.dataSource?.collectionView(self.collectionView!, cellForRowAt: IndexPath(row: 0, section: 0)) {
            self.collectionView?.scrollToItem(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
        }
    

    修改

    正如您所提到的,数据来自服务器,正确的解决方案是在收到Web响应后重新加载collectionView。

    在webservice调用的完成块中,重新加载collectionView,然后滚动到特定的索引路径。

    如果您正在使用alamo fire或AFNetworking,则在主线程上调用完成块,以防在后台线程中执行完成块,确保在重新加载和滚动之前切换到主线程:)

    希望它有所帮助:)快乐编码:)

答案 1 :(得分:2)

这次崩溃可能有很多原因。您可以通过添加多个检查来停止此操作,就像这样 1.检查CollectionView数据 2.等待0.5秒,首先完全加载CollectionView并滚动它。

答案 2 :(得分:1)

你能尝试使用:

  DispatchQueue.main.async {
   self.collectionView?.scrollToItem(at: IndexPath(row: 0, section: 0), at: .top, animated: true)

}

答案 3 :(得分:1)

我正在执行此检查以防止我的应用程序崩溃。奇怪的是,当崩溃发生时,确实存在一个可见的单元格,但是尝试访问它会返回nil。

if let _ = collectionView.cellForItem(at: IndexPath(row: 0, section: 0)) {
    collectionView.scrollToItem(at: IndexPath(item: 0, section: 0), at: .top, animated: true)
}

答案 4 :(得分:1)

尝试在self.collectionView?.scrollToItem之前调用

collectionView.reloadData()

答案 5 :(得分:0)

也许尝试一下?

let indexToScroll = 2
if let itemsCount = collectionView.dataSource?.collectionView(collectionView, numberOfItemsInSection: 0), indexToScroll < itemsCount {
    collectionView.scrollToItem(at: IndexPath(row: indexToScroll, section: 0), at: .centeredHorizontally, animated: true)
}