[ios]UICollectionView 重新加载时更改项目的序列

发布时间: 2017/3/21 23:16:39
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一个非常奇怪的问题,与 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:

它是你的逻辑错误。最初你的按钮都标记 '10' 和使用单元格的第一次你得到使用该标记的按钮︰

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

但然后你更改的标记︰

btn.tag = indexPath.row;

所以的下次你试着让它你不能这样做,并没有您的更新工作。

快速和肮脏的解决方案︰ 从显示中删除单元格时,重置标记。使用 tableView:didEndDisplayingCell:forRowAtIndexPath: 在哪里可以获取标记的按钮的索引路径并重置它到 10

正确的解决办法︰ 不要使用标记,所以你知道有人窃听的索引路径设置按钮,单元格和控制器之间的适当关系。

官方微信
官方QQ群
31647020