5

我正在创建自定义单元格包含UILabel,,UIImageView使用常量标签UILabelUIImageView使用动态标签,表格有 11 个单元格,前 7 个单元格正确加载,当我更改 1、2 时,8、9、10、11 单元格图像视图发生变化, 3, 4, 分别在表格中的单元格,单元格中的标签也是相同的,我是使用图像来勾选表格中的复选框,UITapGestureRecognizer用于更改表格中的图像视图,

我正在使用此代码.....

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier =@"Cell";
    UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:CellIdentifier];


    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] ;
        cell.selectionStyle=UITableViewCellSelectionStyleGray;
        cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
        UIImageView *imageview=[[UIImageView alloc]initWithFrame:CGRectMake(5, 12, 20, 20)];
        imageview.tag=n;
        [cell.contentView addSubview:imageview]; 
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tabimage:)];
        imageview.userInteractionEnabled=YES;
        [imageview addGestureRecognizer:tap];
        imageview.image=[UIImage imageNamed:@"img1.jpeg"];

        UILabel *titleLabel=[[UILabel alloc]initWithFrame:CGRectMake(30, 2, 260,26)];
        titleLabel.tag=222;
        titleLabel.backgroundColor=[UIColor clearColor];
        [cell.contentView addSubview:titleLabel];

        UILabel *dateLabel=[[UILabel alloc]initWithFrame:CGRectMake(30, 31, 260, 13)];
        dateLabel.tag=333;
        dateLabel.font=[UIFont systemFontOfSize:10];
        dateLabel.backgroundColor=[UIColor clearColor];
         [cell.contentView addSubview:dateLabel];
    }
    UIImageView *imageview1=(UIImageView*)[cell.contentView viewWithTag:n];
    if([array containsObject:[NSNumber numberWithInt:imageview1.tag]]) {
       imageview1.image=[UIImage imageNamed:@"img2.jpeg"];  
    } else {
       imageview1.image=[UIImage imageNamed:@"img1.jpeg"];   
    }

    UILabel *titlelable=(UILabel*)[cell.contentView viewWithTag:222];
    titlelable.text=[task objectAtIndex:indexPath.section];
    NSLog(@"%i",indexPath.section);

    UILabel *dateLabel=(UILabel*)[cell.contentView viewWithTag:333];
    dateLabel.text=[date objectAtIndex:indexPath.section];
    n++;
    return  cell;
}

- (void)tabimage:(id)sender {
    UIImageView *iv=(UIImageView *)[sender view];
    int i=iv.tag;
    NSLog(@"------------%i",i);
   if (iv.image==[UIImage imageNamed:@"img1.jpeg"]) {
       iv.image= [UIImage imageNamed:@"img2.jpeg"];
       [array addObject:[NSNumber numberWithInt:i]];
   } else {
      iv.image= [UIImage imageNamed:@"img1.jpeg"];  
      [array removeObject:[NSNumber numberWithInt:i]];
    }
  }
4

5 回答 5

8

您应该将您的单元格标识符从静态更改为动态,这将解决您的问题。

你应该替换这个

static NSString *CellIdentifier =@"Cell";
UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:CellIdentifier];

有了这个

UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"%d %d"], indexPath.row, indexPath.section];
于 2012-10-03T15:05:59.120 回答
4

无论您看到什么问题,使用那个“ n”很可能是问题所在。没有充分的理由使用共享变量来标记(和检索)表格视图单元格上的视图。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath被多次调用,可能同一个cell被调用多次,有时会找到一个cell可以重用,有时不会。

我当然不知道n它是什么,以及如何在代码的其他地方使用它,但是在这里每次调用都会更改它,并且在调用此方法时无法做出假设,因此它毫无价值。

您肯定知道每个单元格都有一个带有该标签的图像,但是在第一次运行此方法后是否可以访问它是完全未定义的,因此每次重用您基本上都会得到随机行为(新的单元格或一个重复使用的带有你不知道的标签的标签)。

问自己(或者在另一个问题中问自己):你想在这里完成什么?

于 2012-10-03T14:06:45.067 回答
2

我正在为我的应用程序获取解决方案,

在我的代码中使用动态单元格标识符

NSString *CellIdentifier =[NSString stringWithFormat:@"%i-%i", indexPath.section,indexPath.row];
于 2012-10-26T11:24:53.583 回答
1

我建议子类 UITableViewCell 添加所有自定义元素,为其创建设置器。而在 cellForRowAtIndexPath 中,只需调用您的设置器。

于 2012-10-25T06:23:46.803 回答
0

当您在 if(cell == nil) 块中将标签设置为 imageview 时,意味着将在创建单元格时设置标签。在您的情况下,在通过出列重用这些单元之后创建了 7 个单元。因此,将使用 8 次以前创建的单元格。这就是为什么您的标签与 1,2,3...对于 8,9,10...单元格相同的原因。

好吧,亚历克斯提出了标准的方法来做到这一点。但是如果你还没有使用自定义单元格,你可以试试这个——

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier =@"Cell";
    UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:CellIdentifier];
    UIImageView *imageview = nil;    
    if(cell){
        for (UIView *view in cell.contentView.subviews){
            if([view isKindOfClass:[UIImageView class]]){
                    imageview = (UIImageView*)view;
                    break;
            }
        }
    }

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] ;
        cell.selectionStyle=UITableViewCellSelectionStyleGray;
        cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
        imageview=[[UIImageView alloc]initWithFrame:CGRectMake(5, 12, 20, 20)];
        [cell.contentView addSubview:imageview]; 
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tabimage:)];
        imageview.userInteractionEnabled=YES;
        [imageview addGestureRecognizer:tap];
        imageview.image=[UIImage imageNamed:@"img1.jpeg"];

        UILabel *titleLabel=[[UILabel alloc]initWithFrame:CGRectMake(30, 2, 260,26)];
        titleLabel.tag=222;
        titleLabel.backgroundColor=[UIColor clearColor];
        [cell.contentView addSubview:titleLabel];

        UILabel *dateLabel=[[UILabel alloc]initWithFrame:CGRectMake(30, 31, 260, 13)];
        dateLabel.tag=333;
        dateLabel.font=[UIFont systemFontOfSize:10];
        dateLabel.backgroundColor=[UIColor clearColor];
         [cell.contentView addSubview:dateLabel];
    }
    imageview.tag=n;
    if([array containsObject:[NSNumber numberWithInt:imageview.tag]]) {
       imageview.image=[UIImage imageNamed:@"img2.jpeg"];  
    } else {
       imageview.image=[UIImage imageNamed:@"img1.jpeg"];   
    }

    UILabel *titlelable=(UILabel*)[cell.contentView viewWithTag:222];
    titlelable.text=[task objectAtIndex:indexPath.section];
    NSLog(@"%i",indexPath.section);

    UILabel *dateLabel=(UILabel*)[cell.contentView viewWithTag:333];
    dateLabel.text=[date objectAtIndex:indexPath.section];
    n++;
    return  cell;
}
于 2012-10-26T06:24:14.283 回答