UICollectionView在重新加载时更改项目序列

时间:2014-03-22 09:32:50

标签: ios iphone objective-c uicollectionview

我对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]

1 个答案:

答案 0 :(得分:1)

这是你的逻辑错误。最初,您的按钮被标记为' 10'并且第一次使用单元格时,您将使用该标记获取按钮:

UIButton *btn = (UIButton *)[myCell viewWithTag:10];

但是你改变了标签:

btn.tag = indexPath.row;

因此,下次您尝试获取它时,您的所有更新都无效。

快速而肮脏的解决方案:从显示屏移除单元格时重置标签。使用tableView:didEndDisplayingCell:forRowAtIndexPath:,您可以在其中获取包含代码索引路径的按钮,并将其重置为10

正确的解决方案:不要使用标签,在按钮,单元格和控制器之间建立正确的关系,这样您就可以知道被点击的索引路径。