当我在代码中使用 FlowLayout 对象并在 CollectionView 对象上调用 reloadData() 时,我的应用程序崩溃了。当我使用标准 FlowLayout(来自 XCode 的设置)时,我没有遇到这样的异常。
这就是我使用 FlowLayout 根据设备宽度计算部分插入的方式。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let layout = UICollectionViewFlowLayout()
layout.itemSize = CGSize(width: itemWidth, height: itemWidth)
layout.minimumInteritemSpacing = minItemSpacing
layout.minimumLineSpacing = minItemSpacing
layout.headerReferenceSize = CGSize(width: 0, height: headerHeight)
let containerWidth = collectionView.bounds.width
if (containerWidth < 350) {
inset = 2
}
else if (containerWidth >= 350 && containerWidth < 400) {
inset = 10
}
else {
inset = 14
}
layout.sectionInset = UIEdgeInsets(top: minItemSpacing, left: inset, bottom: minItemSpacing, right: inset)
collectionView.collectionViewLayout = layout
}
使用这样的代码应用程序正常启动,但是当我从另一个 View Controller 转到使用 CollectionView 并调用 collectionView.reloadData() 的 main 时
@IBAction func saveMyObjects(segue:UIStoryboardSegue) {
if let myObjectsViewController = segue.sourceViewController as? MyObjectsViewController {
MyObjects.Objects.removeAll()
MyObjects.Objects.appendContentsOf(myObjectsViewController.MyObjects)
collectionView.reloadData()
}
}
应用程序因以下异常而崩溃。
* 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[__NSArrayM objectAtIndex:]:索引 0 超出空数组的范围” libc++abi.dylib:以 NSException 类型的未捕获异常终止
如果我发表评论
// collectionView.collectionViewLayout = layout
行使用 XCode 中的值,应用程序正常工作。
附加代码:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! ObjectCollectionViewCell
// Configure the cell
cell.imageView.image = UIImage(named: Groups[indexPath.section].Objects[indexPath.row].Image)
cell.label.text = Groups[indexPath.section].Objects[indexPath.row].Name
if (Groups[indexPath.section].Objects[indexPath.row].Image != "") {
cell.label.hidden = true
cell.imageView.hidden = false
}
else {
cell.imageView.hidden = true
cell.label.hidden = false
}
return cell
}
最佳答案
在多次检查您的代码之后,我认为您的问题是您应该从 viewDidLayoutSubviews()
中删除代码并实现 UICollectionViewDelegateFlowLayout
上现有的方法做你需要的事情,
optional public func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
optional public func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat
optional public func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat
optional public func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize
optional public func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets
我认为,如果您实现此方法并从 viewDidLayoutSubviews()
中删除代码,您的代码将根据您的需要工作,强烈建议不要使用您的方法这样做;),我希望这对您有帮助
关于ios - UICollectionView 的 FlowLayout 和 reloadData(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37817876/