在UITableViewCell中设置UIButton标题

时间:2014-07-07 17:00:40

标签: objective-c uitableview uibutton

我创建了一个UiTableView并设置了UIButton及其标题。由于数据来自Web服务=我在cellForRowAtIndexPath方法中执行此操作。 Tableview使用可重复使用的细胞,因为细胞通常会长到100或更多。所以它是一个记忆的东西。

这就是我的cellForRowAtIndexPath方法:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];

       cell.item = self.dataArray[indexPath.row];

    /* Add a button to the cell - for user name */
    UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [myButton addTarget:self
                     action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];

    /* Setup the button */

    myButton.frame = CGRectMake(214, 5, 93, 21);
    [myButton setTitle:cell.item.userName forState:UIControlStateNormal];
    [cell.contentView addSubview:myButton];


    return cell;
}

问题

这很好用。但是,当我开始滚动时,myButton的标签会显示多个值,看起来我已经在一个按钮上添加了多个标题。我怀疑原因是由于细胞重复使用。 "新"进入视野的细胞仍然具有“#34; old"小区myButton的标题。

问题

如何在不恢复不可重复使用的细胞的情况下避免这种情况?

2 个答案:

答案 0 :(得分:1)

您没有为按钮添加多个标题,实际上您添加了多个按钮。随着

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];

您创建了一个全新的按钮并使用

    [cell.contentView addSubview:sellerButton];

您将其作为子视图添加到单元格中。第一次创建单元格时,它只有一个按钮。但是当重复使用该单元时,它已经有一个按钮(或多个),另一个按钮被添加到顶部。当按钮的背景是透明的时,它看起来像一个带有多个标题的按钮。

解决此问题的一种方法是检查单元格是否已按钮,在这种情况下只更改按钮的标题(例如,使用其他回复中建议的标签) )。

更好的方法是在自定义单元格的初始化方法中添加按钮,在自定义单元格的类中为按钮创建属性,在-tableView:cellForRowAtIndexPath:中只更改按钮的标题。

在MyCustomCell.h中:

@property (strong, nonatomic) UIButton *sellerButton;

在MyCustomCell.m中:

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        /* Add a button to the cell - for user name */
        self.sellerButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [self.sellerButton addTarget:self
                         action:@selector(buttonPressed:)                    
               forControlEvents:UIControlEventTouchUpInside];

        /* Setup the button */
        self.sellerButton.frame = CGRectMake(214, 5, 93, 21);
        [self.sellerButton setTitle:self.item.userName forState:UIControlStateNormal];
        [self.contentView addSubview:self.sellerButton];
    }
    return self;
}

在您的表格中查看控制器的.m文件:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
    cell.item = self.dataArray[indexPath.row];
    [cell.sellerButton setTitle:cell.item.userName forState:UIControlStateNormal];

    return cell;
}

在我看来,这比使用标签在单元格的视图层次中识别按钮更简洁,因为您将单元格的布局配置(不会发生变化)与它呈现的数据(按钮标题)。

答案 1 :(得分:1)

这样的事情可以帮助您防止重复UIButton个对象

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];

    cell.item = self.dataArray[indexPath.row];

    UIButton *myButton = (UIButton *)[cell.contentView viewWithTag:100];
    if (myButton) {
        //button already present
        NSLog(@"Button already present");
    }
    else {
        //button not present
        myButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [myButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [myButton setTag:100];  //needed for this logic to work
        [myButton setFrame:CGRectMake(214, 5, 93, 21)];
        [myButton addTarget:self
                     action:@selector(buttonPressed:)
           forControlEvents:UIControlEventTouchUpInside];

        [cell.contentView addSubview:myButton];
    }

    [myButton setTitle:cell.item.userName forState:UIControlStateNormal];

    return cell;
}