ios - UICollectionView 的 FlowLayout 和 reloadData()

标签 ios swift uicollectionview

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

相关文章:

ios - 将 UIImageView 动态添加到 UIScrollview 中,但无法自动调整大小

swift - 在 NSImageView 之上添加 CATextLayer

ios - tableView reloadData 不更新数据

ios - UIcollectionview 未获取调用数据源

ios - CollectionView 与单元格重叠

ios - UICollectionView 的 UILabel 中的奇怪文本问题

c# - 自定义 UITableViewCell : First Row Has No Content

ios - 如何从 PHPickerViewController 委托(delegate)中获取实时照片或视频

ios - 按距离对 UITableView 进行排序

swift - 是否可以在 Swift 中访问隐藏的顶级函数?