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

时间:2016-01-02 14:53:40

标签: ios swift uicollectionview

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

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

  1. 最初我的UIcollection视图只展示了两个部分。
  2. 然后在用户操作中,我在第0部分或第1部分下添加项目,这取决于项目类别。
  3. 每当我将section设为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])
    }*/
    

1 个答案:

答案 0 :(得分:0)

正如我的评论所说:问题是您使用一个数组来确定两个部分中的项目数。因此,从数组中删除一个项目会导致集合视图失去"失去"两个细胞。丢失两个单元格并不会与你告诉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])
}

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