iPhone应用程序在UICollectionView的didDeselectItemAtIndexPath中崩溃

时间:2014-12-05 12:05:55

标签: ios objective-c iphone nsmutablearray uicollectionview

我已在我的应用程序中实施UICollectionView,当我从UICollectionView取消选择图片时,我将从UIImage删除NSMutableArray。现在我的问题是,如果图像超过两个并且我取消选择那些图像,那么我的应用程序就会崩溃。

并且收到错误

  

由于未捕获的异常终止应用' NSRangeException',原因:' *** - [__ NSArrayM removeObjectAtIndex:]:索引2超出边界[0 .. 1]'

以下是我的代码

- (void)collectionView:(UICollectionView *)collectionView 
        didDeselectItemAtIndexPath:(NSIndexPath *)indexPath
{
    [selectedImagesArray removeObjectAtIndex:indexPath.row];
}

我得到的indexPath超出了那个数组。

5 个答案:

答案 0 :(得分:0)

IndexPath不一定有行属性,因此可能为零。如果它是零,你会看到崩溃

答案 1 :(得分:0)

检查数组计数是否大于indexPath.row属性,然后删除或检查该索引是否存在数组元素,如果是,则删除元素

if(selectedImageArray[indexPath.row] != nil) {
   [selectedImagesArray removeObjectAtIndex:indexPath.row];
}

答案 2 :(得分:0)

Indexpath.row将返回实际数组的索引而非选定的数组索引。 因此,您必须在SelectedArray中找到相同的元素,然后您才能从所选数组中删除该图像。

例如

实际数组对象

[1,2,3,4,5,6,7,8,9,10]

由此您选择了对象

[1,5,7]

所以对象[1,5,7]将处于选定状态,也会处于SelectedArray

当您选择对象7Indexpath.row将返回6

您正在直接删除6中的索引SelectedArray,该索引不可用,因此您收到此错误。

答案 3 :(得分:0)

您必须使用indexPath.item。 这通常用于collectionView。 IndexPath.row用于TableView。

无论如何,在它周围放置一个if条件来检查这个索引是否存在。

答案 4 :(得分:-1)

添加以下代码来处理支票:

if ([indexPath.row] < [selectedImagesArray count]) {

    [selectedImagesArray removeObjectAtIndex:indexPath.row];
}