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 部分中的项目数无效 - 虽然有多个部分的主要内容,如果未能解决你的问题,请参考以下文章