iOS表格视图单元格未显示预期的行为

时间:2013-12-26 19:19:58

标签: ios reuseidentifier

昨天我问了一个关于单元格没有正确显示取决于字符串值的按钮的问题。如果您需要,请查看它:Strange behaviour on table view with core data

用户@jrturton在他的回答中指出了以下内容:

  

重复使用的单元格每次都会添加子视图 - 所以可以   彼此之间有许多紧急的观点。细胞应该永远   添加一次并将其保存在属性中

我认为这个答案标志着我必须遵循的正确方向来解决我的问题,但我无法在我的代码中实现以下答案:

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    NSManagedObject *managedObject = [fetchedResultsController   objectAtIndexPath:indexPath];

    NSString *isUrgent = [[managedObject valueForKey:@"urgent"]description];


    [[cell textLabel] setText:[[managedObject valueForKey:@"thingName"] description]];


    //urgent

    if ([isUrgent isEqual:@"Urgent"]){
    UIButton *urgentButton = [[UIButton alloc]initWithFrame:CGRectMake(71, 27, 18, 18)];
    [urgentButton setImage:[UIImage imageNamed:@"urgent-3"]forState:UIControlStateNormal];
    [cell addSubview:urgentButton];
        NSLog(isUrgent);
    }
    //not urgent 
    if ([isUrgent isEqual:@"Not urgent"]){
        UIButton *urgentButton = [[UIButton alloc]initWithFrame:CGRectMake(71, 27, 18, 18)];
        [urgentButton setImage:[UIImage imageNamed:nil]forState:UIControlStateNormal];
        [cell addSubview:urgentButton];
        NSLog(isUrgent);
    }


    [[cell detailTextLabel] setText:@"  "];
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    cell.textLabel.textColor = [UIColor blueColor];
    cell.textLabel.font = [UIFont fontWithName:@"Noteworthy" size:22.0f];
    cell.detailTextLabel.font = [UIFont fontWithName:@"Noteworthy" size:15.0f];

}

细胞的行为必须遵循:

1. If isUrgent = @"Urgent", the cell must show urgentButton (including imageNamed:@"urgent-3":
2. Else no button has to be shown.

目前的行为如下:

1. If isUrgent = @"Urgent", the cell shows urgentButton (including imageNamed:@"urgent-3".
2. If isUrgent = @"Not urgent", value tested in NSLog, the cell shows urgentButton too.

仅当单元格至少更改了一次isUrgent值时,才会发生此行为。

我需要你的帮助才能实现上述答案。谢谢。

2 个答案:

答案 0 :(得分:1)

您需要跟踪您的细胞被重复使用或者是新细胞。

这里可能会发生的是你将UIButton添加到重用的单元格中,但它已经有了具有“紧急-3”图像集的按钮

这样做

  1. 再传递一个BOOL参数来配置单元格isFreshCell,其值设置为新单元格。
  2. **

    MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    isFreshCell = NO;
    if(cell==nil)
    {
     isFreshCell = YES;
     cell = [[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    } 
    [self configureCell:cell atIndexPath:indexPath isFreshCell:isFreshCell];
    

    新方法签名

    -(void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath isFreshCell:(BOOL) isFreshCell
    

    2添加按钮时为其设置了一些标记。

    3如果isFreshCell为false,则不要添加新按钮,因为它已经存在,您可以使用subviewWithTag方法访问此按钮,如此cell.contentView.subviewWithTag,然后设置图像或设置nil图像或只是隐藏按钮

答案 1 :(得分:1)

我同意@wuii,但我认为答案可以更清晰。我们的想法是,重用的单元格已经构建了它们的视图层次结构,因此每次重用单元格时都会再次执行它(这在滚动过程中始终是这样)。建议可以封装在一个“懒惰的getter”中,返回单元格的紧急按钮。

// above @implementation
#define kURGENT_BUTTON_TAG  (256)

- (UIButton *)urgentButtonInCell:(UITableViewCell *)cell {

    UIButton *urgentButton = (UIButton *)[cell viewWithTag:kURGENT_BUTTON_TAG];
    if (!urgentButton) {
        urgentButton = [[UIButton alloc]initWithFrame:CGRectMake(71, 27, 18, 18)];
        urgentButton.tag = kURGENT_BUTTON_TAG;
        [cell addSubview:urgentButton];
    }
    return urgentButton;
}

现在您的configureCell可以只询问按钮:

UIButton *urgentButton = [self urgentButtonInCell:cell];
UIImage *image = ([isUrgent isEqualToString:@"Urgent"])? [UIImage imageNamed:@"urgent-3"] : nil;
[urgentButton setImage:image forState:UIControlStateNormal];