在 UICollectionView 中的当前索引之前添加一个对象

Posted

技术标签:

【中文标题】在 UICollectionView 中的当前索引之前添加一个对象【英文标题】:Adding an object before the current index in UICollectionView 【发布时间】:2013-12-05 23:03:27 【问题描述】:

我有一个简单的集合视图,它有两种类型的单元格。一个计数器单元和一个“添加”单元。我的目标是在添加新对象后让“添加”单元格保留在索引的末尾。当我运行应用程序时,会出现我的“添加”单元格,但按下“添加”按钮时出现错误。

这是错误:

由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'无效更新:无效 第 0 节中的项目数。包含在第 0 节中的项目数 更新后的现有节(1)必须等于 更新前该部分中包含的项目 (1),加号或减号 从该部分插入或删除的项目数(插入 1 个, 0 已删除)加上或减去移入或移出的项目数 该部分(0 移入,0 移出)。'

这是我的代码:

// retrievedCounters is an NSMutableDictionary

- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView 
   // only want one section
    return 1;


- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section 
    // get the current count and add one for the "add" cell
    return retrievedCounters.count + 1;


- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
    UICollectionViewCell *cell;

    // check whether the index path is at the very end and add the appropriate cell

    if (indexPath.row == retrievedCounters.count) 
        cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"AddCounter" forIndexPath:indexPath];
    

    else 
        cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CounterCell" forIndexPath:indexPath];
    

    return cell;


- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

    [collectionView deselectItemAtIndexPath:indexPath animated:YES];

     // insert new counter at index path
     [self.collectionView insertItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:retrievedCounters.count-1 inSection:0]]];


感谢任何可以提供帮助的人!

【问题讨论】:

【参考方案1】:

该错误表明更改数据源时出现数据源问题。可变字典中的键数不正确。

大概您使用NSIndexPaths 作为键和您需要的数据作为值。我认为使用数组更容易(indexPath.row 会简单地以正确的顺序指向正确的对象)。

检查您更改数据源中数据的更新方法。您应该确保您的字典包含预期数量的项目。

在您的错误消息中,插入前后的 1 项似乎表明您的字典可能变为 nil,因此返回零计数。确保您有一个正确实例化的实例变量。

【讨论】:

你是对的,我的数据源没有被正确更改。有时用一双新的眼睛看你的代码真是太好了。谢谢。【参考方案2】:

每当您添加新对象时,都在您的对象数组中 为新对象创建新数组,然后像这样添加它

 [existingArray addObjectsFromArray:newarray];

将保持顺序

【讨论】:

他使用的不是对象数组,而是字典。

以上是关于在 UICollectionView 中的当前索引之前添加一个对象的主要内容,如果未能解决你的问题,请参考以下文章

为啥在索引路径中的 UICollectionView 的 cellForItem 在一开始就被所有单元格调用

如何获取UICollectionView中选中的单元格索引

将 UILabel 添加到 UICollectionView 中的特定索引路径

由于索引超出范围,uitableviewcell 滚动中的 uicollectionview 将崩溃

表格视图单元格中的 uicollectionview 出现错误:索引超出范围,为啥?

数据源数组正确时 UICollectionView 中的“索引超出范围”错误