所以我在viewDidLoad函数中放置了以下代码,它崩溃了应用程序。任何想法为什么会发生这种情况或解决这个问题?
SecondForm
--------------- EDIT --------------- 添加了错误日志
self.collectionView?.scrollToItem(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
答案 0 :(得分:4)
可能的问题
你的collectionView数据源是否有任何数据,如果它是nil,numberOfItemsInSection将返回0并且因为你要求collectionView滚动到indexPath IndexPath(row: 0, section: 0)
并且因为没有单元格它可能会崩溃。
<强>解决方案强>
确保您的数据源不是nil或至少返回一个单元格
滚动到ViewDidAppear
中的指定indexPath(假设在调用ViewDidAppear时你将获得一些数据)
解决方法
在要求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)
}