首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FlowLayout of UICollectionView和reloadData()

FlowLayout of UICollectionView和reloadData()
EN

Stack Overflow用户
提问于 2016-06-14 16:49:19
回答 1查看 1.4K关注 0票数 0

当我在代码中使用FlowLayout对象并在CollectionView对象上调用reloadData()时,我的应用程序会崩溃。当我使用标准FlowLayout (来自XCode的设置)时,我没有这样的异常。

这就是我如何使用FlowLayout计算节内嵌取决于设备的宽度。

代码语言:javascript
复制
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
}

使用这样的代码,应用程序通常会启动,但是当我从另一个视图控制器转到使用CollectionView并调用collectionView.reloadData()的主视图时

代码语言:javascript
复制
@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类型的未定义异常终止

如果我评论

代码语言:javascript
复制
// collectionView.collectionViewLayout = layout 

使用XCode值的行,app毫无例外地工作。

附加代码:

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-15 15:53:59

在多次检查代码之后,我认为您的问题是应该从viewDidLayoutSubviews()中删除代码并实现UICollectionViewDelegateFlowLayout上存在的方法以满足您的需要,

代码语言:javascript
复制
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()中删除您的代码,您的代码将根据您的需要工作,非常不鼓励使用您的方法;),我希望这可以帮助您

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37817876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档