我对UICollectionView
有一个非常奇怪的问题。每当我尝试通过[mycollectopn reloaddata]
重新加载我的集合视图时,项目序列就会发生变化。
例如,我的集合视图中有9个项目,项目0处有mybutton1但是每当我重新加载集合视图时,mybutton1会进入第6个位置并且与所有其他项目的行为相同。
以前有人遇到过同样的问题吗?任何帮助将不胜感激。这就是我所做的
-(NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView {
return 1;
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return [BtnImgArray count];
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
cellForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *myCell = [collectionView
dequeueReusableCellWithReuseIdentifier:@"collection"
forIndexPath:indexPath];
UIButton *btn = (UIButton *)[myCell viewWithTag:10];
btn.tag = indexPath.row;
[btn setImage:[UIImage imageNamed:[BtnImgArray objectAtIndex:indexPath.row]] forState:UIControlStateNormal];
[btn setImage:[UIImage imageNamed:[BtnImgArraySelected objectAtIndex:indexPath.row]] forState:UIControlStateSelected];
btn.titleLabel.textAlignment = NSTextAlignmentCenter;
if (indexPath.item==0 && ModeOfSpa == 0)
{
[btn setSelected:true];
[btn setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];
}
else if(indexPath.row ==1 && ModeOfSpa == 1)
{
[btn setSelected:true];
[btn setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];
}
else
{
btn.titleLabel.textColor = [UIColor whiteColor];
}
if (indexPath.item== 4) {
[btn setTitle:[NSString stringWithFormat:@"%@\n%@",@"All On", @"Mode"] forState:UIControlStateNormal];
}
else if (indexPath.item== 5) {
[btn setTitle:[NSString stringWithFormat:@"%@\n%@",@"Clean", @"Mode"] forState:UIControlStateNormal];
}
else{
NSString * str = [detailvwlblArray objectAtIndex:indexPath.row];
[btn setTitle:[str substringFromIndex:9] forState:UIControlStateNormal];
}
[btn addTarget:self action:@selector(BtnClicked:) forControlEvents:UIControlEventTouchUpInside];
return myCell;
}
在viewWillAppear
中,我使用了[myCollectionView ReloadData]
答案 0 :(得分:1)
这是你的逻辑错误。最初,您的按钮被标记为' 10'并且第一次使用单元格时,您将使用该标记获取按钮:
UIButton *btn = (UIButton *)[myCell viewWithTag:10];
但是你改变了标签:
btn.tag = indexPath.row;
因此,下次您尝试获取它时,您的所有更新都无效。
快速而肮脏的解决方案:从显示屏移除单元格时重置标签。使用tableView:didEndDisplayingCell:forRowAtIndexPath:
,您可以在其中获取包含代码索引路径的按钮,并将其重置为10
。
正确的解决方案:不要使用标签,在按钮,单元格和控制器之间建立正确的关系,这样您就可以知道被点击的索引路径。