每当我尝试插入删除单元格(有2个补充标题部分)时,使用带有FlowLayout的swift UICollectionView,它会给出以下错误:
由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第1部分中的项目无效。更新后的现有部分中包含的项目数(1)必须等于项目数在更新(0)之前包含在该部分中,加上或减去从该部分插入或删除的项目数(0插入,0删除)和加或减移入或移出该部分的项目数(0移入,0搬出去。'
每当我将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])
}*/
答案 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])
}
添加新项目时必须使用相同的逻辑。