Swift,CollectionView,致命错误:索引超出范围

Posted

技术标签:

【中文标题】Swift,CollectionView,致命错误:索引超出范围【英文标题】:Swift, CollectionView, fatal error: Index out of range 【发布时间】:2016-04-07 03:39:01 【问题描述】:

我下载了一组图像并将它们加载到一个 collectionView 中。我希望能够在按下单个单元格时将所选的单个项目添加到我全局声明的数组中,这样我就可以循环遍历它们以便稍后从核心数据中删除。这条线在项目的顺序方面打印得很好 - print("You selected cell #(indexPath.item)!"),但是第二次按另一个单元格添加到数组中时,我得到一个 fatal错误:索引超出范围错误。我不知道我得到了什么。

var selectedCell: [Int] =  []     -> Declared globally


    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 
        // handle tap events

        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MyCollectionViewCell


        print("You selected cell #\(indexPath.item)!")

        if self.selectedCell.contains(indexPath.item)
            print("Item already added")
         else 
            self.selectedCell.append(indexPath.item)
        

        if selectedCell.count > 0 
            toolbarButton.title = "Remove Item"
        

//        let selectCell:UICollectionViewCell = collectionView.cellForItemAtIndexPath(indexPath)!
//        selectCell.contentView.backgroundColor = UIColor.whiteColor()

    

【问题讨论】:

哪一行给出了数组索引异常? self.selectedCell.append(indexPath.item) 我怀疑是其他行。 append 不能给你那个例外。您的代码中的那两条注释行是什么?为什么它们被注释掉了? 如果它们被选中,它们会改变单元格背景的颜色。 在声明selectedCell时,是否还声明了任何特殊的get/set/willSet/didSet代码块? 【参考方案1】:

iOS 9.3、Xcode 7.3

老实说,我认为 "fatal error: Index out of range" 不适用于您声明的更简单的整数索引数组,我认为它与集合视图的索引相关联自己。

看起来您符合UICollectionView 的各种协议,即UICollectionViewDataSource, UICollectionViewDelegate,因为您至少接收到单元格选择方法的回调。

首先让我震惊的是……

toolbarButtontitle 属性在哪里声明,它是UIButton 的自定义子类,因为title 不是标准UIButton 类的可设置属性。这就是您通常设置UIBUtton 标题的方式...

self.toolbarButton.setTitle("Remove Item", forState: .Normal)

还有一点,

 let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MyCollectionViewCell

变量cell 从未在该函数中使用,它应该给你一个警告。

此外,请检查您对数组变量selectedCell 的所有使用情况,例如在您检查未使用self.selectedCell 的计数值的if 语句中。不确定这会做什么,但我认为这会导致您的阵列重新合成,因此每次都会重置计数。

我不明白的其他项目很少,这是我将使用的代码。请检查您的代码和语法。

以下代码有效:

var selectedCell: [Int] =  []

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)

    // handle tap events

    print("You selected cell #\(indexPath.item)!")

    if (self.selectedCell.contains(indexPath.item))
    
        print("Item already added")
    
    else
    
        self.selectedCell.append(indexPath.item)
    

    print("selectedCell.count: \(self.selectedCell.count)")

    if (self.selectedCell.count > 0)
    
        self.toolbarButton.setTitle("Remove Item", forState: .Normal)

        print("selectedCell: \(self.selectedCell)")
    
    else
    
        //nil
    

输出看起来像这样:

注意:当您单击同一个单元格两次时,它不会被添加(在本例中为 8 次),一旦数组中至少有 1 个项目,按钮标题就会更改。

如果你还是不明白,那么看这篇文章,它很好地解释了如何实现一个集合视图:https://***.com/a/31735229/4018041

希望这会有所帮助!干杯。

【讨论】:

以上是关于Swift,CollectionView,致命错误:索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章

CollectionView - 致命错误:索引超出范围 - 比视图显示的单元格多

CollectionView 致命错误:在展开可选值时意外发现 nil

使用 AlamoFireImage 在 CollectionView 中使用 .af_setImage 方法加载数组 url 的致命错误

Swift - 创建没有 Storyboard initWithFrame 错误的 collectionView

Swift CollectionView 显示错误

致命错误:索引超出范围:Swift