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

Posted

技术标签:

【中文标题】滚动后自定义 UITableViewCell 按钮标题不再可见(重用)【英文标题】:Custom UITableViewCell button title no longer visible after scrolling (reuse) 【发布时间】:2015-03-04 22:21:46 【问题描述】:

情节提要的动态原型自定义单元格包含一个系统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。它有标题和标题颜色,但标题不再可见。

我尝试过的:

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

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

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

更新:

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

【问题讨论】:

你能把你的cellForRowAtIndexPath的整个代码放上去吗?另外,您能解释一下您的屏幕截图中没有出现哪个部分吗? 在屏幕截图中,底部出现的单元格没有在“加拉太书 3:26”标签旁边显示“3 个有用的投票”,即使我可以检查该单元格的按钮调试器,并查看其标题是否已设置。 cellForRowAtIndexPath 使可重用单元出列,并设置单元的属性。那里没有分配。我可以发布代码,但它很长,而且我不想掩盖按钮标题问题。 您是否使用prepareForReuse 重置单元格内容? @pbasdf 不,我所做的只是设置它的标题。 (还没有发展到我什至连接目标动作的地步。)我需要做些什么才能让按钮本身被重用?这是我第一次在故事板自定义单元格中使用 UIButton。 (故事板)原型按钮显然是由 Apple 自己的代码正确连接、分配和初始化的,但不清楚为什么该特定控件存在明显的重用问题。 我认为您应该发布您的-tableView:cellForRowAtIndexPath: 代码。否则没有太多关于可能是什么问题的信息。 【参考方案1】:

我认为你在不知不觉中混合了单元格样式。

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

(您可以使用多种单元格样式,但每个单元格样式有不同的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

【讨论】:

感谢您尝试解决问题 :) 绝对不要使用多个单元格样式。我只有 1 个自定义动态原型单元,我使用 BIBLETableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 将其出列。我已经将UITableViewCell 子类化并通过Interface Builder 连接了按钮,所以我不需要使用标签。只要我不尝试将按钮标题从一个单元格更改为另一个单元格,按钮标题就会出现在每个单元格中。 你说的一切听起来都不错,你一定有错字。我们能看到代码吗?无论如何,我删除了标签,使用 @property (weak, nonatomic) IBOutlet UIButton *detailButton; 创建了一个 BIBLETableViewCell 类。现在使用上面的代码,我可以调用 [cell.detailButton setTitle:votes forState:UIControlStateNormal];它工作正常。你可能对约束有疑问——它们总是把事情搞砸。如果关闭一个像素,则不会显示标题。 感谢您证明它在您的示例代码中有效。看起来自动布局正在将按钮框架放置在正确的位置。 (我可以通过临时为按钮设置背景颜色来看到这一点。)但是没有可见的标题,只有背景。我认为您对影响按钮标题的约束是正确的,因为标题仅在其宽度(长度)发生变化时才会消失。

以上是关于滚动后自定义 UITableViewCell 按钮标题不再可见(重用)的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableViewCell 快速滚动

滚动时 UITableViewCell 的奇怪行为,UIButtons 消失

UITableViewCell 不保存自定义按钮的状态

滚动时如何向 UITableViewCell 添加更多按钮?

滚动时 UITableViewCell 的选定按钮消失

在滚动 UITableViewCell 添加按钮图像问题