gpt4 book ai didi

ios - UICollectionView 的 FlowLayout 和 reloadData()

转载 作者:行者123 更新时间:2023-11-30 13:20:27 25 4
gpt4 key购买 nike

当我在代码中使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com