滚动(重复使用)后,自定义UITableViewCell按钮标题不再可见

时间:2015-03-04 22:21:47

标签: ios uitableview ios8 uibutton storyboard

故事板的动态原型自定义单元格包含系统UIButton

我在cellForRowAtIndexPath中设置了按钮的标题:

NSInteger votesCount = verse.helpfulVotesCount.integerValue;
NSString *votes = [NSString stringWithFormat:@"​​%ld helpful vote%@", (unsigned long)votesCount, votesCount == 1 ? @"" : @"s"];

[cell.detailButton setTitle:votes forState:UIControlStateNormal];

最初所有内容都显示正常,直到单元格在屏幕外滚动。此时,重复使用的单元格按钮标题不再可见。

我查了一下:

  • 自定义单元格的按钮属性,包括其frame。它的位置和大小都是正确的。

  • 按钮的statetitleForStatetitleColorForState。它有标题和标题颜色,但标题不再可见。

我尝试过的事情:

  • 将按钮类型从“系统”更改为“自定义”。按钮标题仍然消失。

  • 设置按钮的背景颜色。背景显示,标题的高度和宽度正确,但标题本身不可见。

为什么滚动后按钮标题会消失?

更新

  • 如果我将每个单元格的按钮标题设置为相同的字符串,则滚动后标题仍然可见。当新标题与之前的标题不同时,按钮标题显然会消失。

enter image description here

1 个答案:

答案 0 :(得分:0)

我认为你在不知道的情况下混合细胞样式。

没有代码可供我们查看...
所以让我展示一种方法来解决它...
仅使用一种单元格样式并使用标签。

(您可以使用多个单元格样式,但每种单元格样式都有不同的dequeueReusableCellWithIdentifier)

我正在使用动态原型单元格 单元格样式设置为自定义
我尝试使用与你相同的布局

我向按钮提供了201

的标签

我还使用有用的投票标签来显示该行 在IB中,我给它标记了202

所有内容都在故事板中创建 我只是在cellForRowAtIndexPath中使用引用:

我还创建了一个@IBAction doSomething,
证明我们可以跟踪点击哪个按钮。

图片链接:http://tinypic.com/r/1yl1l4/8

- (IBAction)doSomething:(UIButton*)sender {
    NSLog(@"Button row clicked: %ld",(long)sender.titleLabel.tag);
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

    // Configure the cell...
    NSInteger votesCount = indexPath.row;
    NSString *votes =
    [NSString stringWithFormat:@"​​%ld helpful vote%@",
     (unsigned long)votesCount, votesCount == 1 ? @"" : @"s"];

    UILabel *helpfulVotes = (UILabel *)[cell viewWithTag:202];
    [helpfulVotes setText:votes];

    UIButton *detailButton = (UIButton *)[cell viewWithTag:201];
    [detailButton setTitle:votes forState:UIControlStateNormal];
    //save indexPath.row inside this tag
    detailButton.titleLabel.tag = indexPath.row;

    return cell;
}

Swift版本,就像俚语Objective-C:

    @IBAction func doSomething(sender: UIButton) {
    if let tag = sender.titleLabel?.tag {
        println("row:\(tag)")
    }
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
    // Configure the cell...
    var someTitle = cell.viewWithTag(202) as UILabel
    someTitle.text = "Row \(indexPath.row):00"

    var detailButton = cell.viewWithTag(201) as UIButton
    //save indexPath.row inside this tag
    detailButton.titleLabel?.tag = indexPath.row
    detailButton.setTitle("Button:\(indexPath.row)",
        forState: UIControlState.Normal)

    return cell
}