UICollectionView重载数据问题

时间:2013-05-13 08:36:55

标签: ios objective-c uicollectionview uicollectionviewcell

我在使用UICollectionView重新加载数据时出现问题。我在viewDidLoad上有这个数组来填充UICollectionView.

array = [[NSMutableArray alloc] init];
[array addObject:@"1"];
[array addObject:@"2"];
[array addObject:@"3"];
[array addObject:@"4"];
[array addObject:@"5"];
[array addObject:@"6"];

和方法:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = @"Cell";
    //cell = [[UICollectionViewCell alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    myCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(5, 0, 100, 20)];
    [titleLabel setText:[array objectAtIndex:indexPath.row]];
    titleLabel.textColor = [UIColor whiteColor];
    titleLabel.backgroundColor = [UIColor clearColor];
    [cell addSubview:titleLabel];

    return cell;
}

点按UIButton,重新加载数据:

[myCollectionView reloadData];

这里重新加载之前和之后的数据如何: Before

After

4 个答案:

答案 0 :(得分:12)

每次点击重新加载按钮时都会添加新标签。您应该添加一次标签并根据标记更改标签文本。

这是一个简单的例子。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    MyCell *cell = (MyCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"Cell"
                                                                               forIndexPath:indexPath];
    [cell setMyTextLabel:indexPath.row];
    return cell;
}

其中MyCell将包含UILabel以及用于修改其文字的属性。

我真的建议您通过 @Ben Scheirman 查看Fun with UICollectionView代码。

希望有所帮助。

P.S。将myCell重命名为MyCell。一个类应该以大写字母开头。

答案 1 :(得分:1)

点击重新加载按钮时,您正在添加标签。在这种情况下,您一次又一次地添加标签......

所以有三种解决方案:

  • 让您的手机可重复使用
  • 在重装方法中从superview中删除您的单元格。
  • 您可以检查标签的text长度是否不等于零。在这种情况下,无需添加该标签并更改文本。

答案 2 :(得分:1)

 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
 {
       UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath];
dispatch_async(dispatch_get_main_queue(), ^{

  //  ********* Changed *******

        for (UIView *v in [cell.contentView subviews])
        [v removeFromSuperview];

 // ********** Changed **********
            if ([self.collectionviewFlow.indexPathsForVisibleItems containsObject:indexPath]) {
            NSString *img_name=[NSString stringWithFormat:@"%@_thumb%d.png",self.VaritiesName,(int)indexPath.row+1];
            imageVw=[[UIImageView alloc]initWithImage:[UIImage imageNamed: img_name]];
            imageVw.frame=CGRectMake(10,10,100,100);
            [cell.contentView addSubview:imageVw];
            }
       });
     cell.backgroundColor=[UIColor clearColor];
     return cell;
}

答案 3 :(得分:0)

现在已经很晚了,但这是我的解决方案。

如果您使用自定义collectionviewcell 尝试使用' func prepareForReuse()'