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

时间:2016-04-07 03:39:01

标签: ios arrays swift uicollectionview

我下载了一组图像并将它们加载到collectionView中。我希望能够将所选的单个项目添加到我在全局声明的数组中,只要我按下单个单元格,然后我就可以循环它们以便稍后从核心数据中删除。这行在项目的顺序打印很好 - 打印(“你选择的单元格#(indexPath.item)!”),但第二次按下另一个单元格添加到数组时,我得到致命错误:索引超出范围错误。我不知道我得到了什么。

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()

    }

1 个答案:

答案 0 :(得分:1)

iOS 9.3,Xcode 7.3

老实说,我认为“致命错误:索引超出范围”不适用于您声明的更简单的整数索引数组,我认为它与集合视图的索引相关联本身。

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

第一件事就是......

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

的标题的方法
self.toolbarButton.setTitle("Remove Item", forState: .Normal)

另一件事是,

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

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

另外,检查数组变量selectedCell的所有用法,在if语句中检查您未使用的计数值self.selectedCell。不知道这会做什么,但我认为这会导致你的数组被重新合成,所以每次都会重置计数。

我不理解的其他项目很少,这里是我要使用的代码。请检查您的代码和语法。

以下代码有效:

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
    }
}

输出看起来像这样:

enter image description here

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

如果你仍然无法弄明白,那么请看这篇文章,它解释了如何很好地实现集合视图:https://stackoverflow.com/a/31735229/4018041

希望这有帮助!欢呼声。