iOS开发:两个UICollectionView重复显示数据源最后一项+索引越界问题求助
iOS开发:两个UICollectionView重复显示数据源最后一项+索引越界问题求助
嘿,我一眼就瞅出你代码里的核心问题啦!不管是重复显示最后一项还是索引越界,根源都是错误地使用了indexPath.count来获取当前cell对应的数据源索引,咱们一个个说:
1. ClothingVC 重复显示最后一项的问题
看你cellForItemAt方法里的这行代码:
let clotheslistItem: Garment = clothesList[indexPath.count]
这里的indexPath.count是用来获取indexPath这个对象包含的维度数量(比如它包含section和item两个维度,所以count固定是2),不管当前是哪个cell,你都在取数组的第2个索引(也就是clothesList[2],对应"Skirt 2"),自然所有cell都显示最后一项!
修正代码:把indexPath.count换成indexPath.item,这才是获取当前cell在section中对应项的索引:
let clotheslistItem: Garment = clothesList[indexPath.item]
2. ProfileSelectorVC 重复显示+索引越界问题
同样的坑你又踩了一遍,看这行:
let profile: Profile = profiles[indexPath.count-1]
indexPath.count还是固定为2,减1后是1,所以你每次都取profiles[1](对应"Betty"),所有cell自然都显示Betty。而当你的数据源长度小于2时,profiles[1]就会触发索引越界(比如数组只有1个元素,索引只能到0)。
修正代码:同样换成indexPath.item:
let profile: Profile = profiles[indexPath.item]
额外小提醒
indexPath的正确用法要记牢:
indexPath.section:获取当前cell所在的分段索引indexPath.item:获取当前cell在分段中的项索引(TableView里对应的是indexPath.row)indexPath.count:这个属性几乎不会在cell复用场景用到,它表示的是索引路径包含的层级数(比如section+item就是2层),和当前cell的位置完全无关!
另外你的ClothingVC里viewDidLoad调用clothesViewGrid.reloadData()其实可以去掉,因为CollectionView在视图加载完成后会自动调用数据源方法加载数据,不过这不是导致bug的原因。
内容来源于stack exchange
相关产品推荐
相关产品推荐

