NSInternalInconsistencyException',原因:'无效更新:第 1 部分中的项目数无效 - 虽然有多个部分

Posted

技术标签:

【中文标题】NSInternalInconsistencyException\',原因:\'无效更新:第 1 部分中的项目数无效 - 虽然有多个部分【英文标题】:NSInternalInconsistencyException', reason: 'Invalid update: invalid number of items in section 1 - While having multiple SectionsNSInternalInconsistencyException',原因:'无效更新:第 1 部分中的项目数无效 - 虽然有多个部分 【发布时间】:2016-01-02 14:53:40 【问题描述】:

当我尝试插入删除单元格(具有 2 个补充标题部分)时使用带有 FlowLayout 的 swift UICollectionView 时,它会给出以下错误:

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

    最初我的 UIcollection 视图只显示两个部分。 然后根据用户操作,我在第 0 节或第 1 节下添加项目,具体取决于项目类别。

每当我将部分设置为 1 insertItemsAtIndexPaths 和 deleteItemsAtIndexPaths 时都可以正常工作。我正在使用 ios9 和 swift 。看过很多帖子并尝试过,但一直卡在这里。 var selectedPlayerDispCollection = [(String, PlayersProfile)]

func numberOfSectionsInCollectionView(collectionView:UICollectionView!) -> Int 
        return 2


 func collectionView(collectionView: UICollectionView!,numberOfItemsInSection section: Int) -> Int 
        return selectedPlayerDispCollection.count


func performBatchUpdates(updates: (() -> Void)?,
    completion: ((Bool) -> Void)?)
        self.collectionView.reloadData()


**// For now adding in section 0 , depending on condition will add in section 0 or section 1
    func addPlayerView(playertapped : PlayersProfile) 
    let count = selectedPlayerDispCollection.count
    //let index = count > 0 ? count - 1 : count
    let index = count
    let playerDisSec = [(playertapped.playerSpeciality, playertapped)]
    selectedPlayerDispCollection.insert(playerDisSec, atIndex: index)
    let indexPath = NSIndexPath(forRow: index, inSection: 0)
    collectionView.insertItemsAtIndexPaths([indexPath])
**


/*func addPlayerView(playertapped : PlayersProfile) 
     let count = selectedPlayerDispCollection.count
      let index = count > 0 ? count - 1 : count
        selectedPlayerDispCollection.insert(playertapped, atIndex: index)
        let indexPath = NSIndexPath(forRow: index, inSection: 0)
        collectionView.insertItemsAtIndexPaths([indexPath])
*/

【问题讨论】:

您告诉 collectionview 删除 1 项并从后备数组中删除一项。但另一方面,您使用 array.count 来确定两个部分中的元素数量 - 这会导致从数组中删除 1 个项目,从而导致 collectionview 的 2 个单元格更少。要么分开部分之间的数据,要么删除两个项目。 【参考方案1】:

正如我的评论已经说过的:问题是您使用一个数组来确定两个部分中的项目数。因此,从数组中删除一项会导致 collectionview “丢失”两个单元格。丢失两个单元格与您告诉 collectionView 的内容不符:在 indexPath abc 处删除一个单元格。

解决方案 1

使用两个单独的数组作为每个部分的支持,或者使用一个带有子数组的数组。

解决方案 2

告诉collectionview删除/添加两个项目:

if let index = selectedPlayerDispCollection.indexOf(playertapped)
    let indexPath0 = NSIndexPath(forItem: index, inSection: 0)
    let indexPath1 = NSIndexPath(forItem: index, inSection: 1)
    selectedPlayerDispCollection.removeAtIndex(index)
    collectionView.deleteItemsAtIndexPaths([indexPath0, indexPath1])

添加新项目时必须使用相同的逻辑。

【讨论】:

最初我的 UIcollection 视图只显示了两个部分。然后在用户操作中,我在第 0 节或第 1 节下添加项目,这取决于项目类别。我已经更新了我的 insertItems 问题中的代码。 根据我提到的评论,我试图只在一个部分项目中进行操作。请建议可以做什么?

以上是关于NSInternalInconsistencyException',原因:'无效更新:第 1 部分中的项目数无效 - 虽然有多个部分的主要内容,如果未能解决你的问题,请参考以下文章

无法在包中加载 Nib - 错误的 nibname 错误