滚动后自定义 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
。它的位置和大小是正确的。
按钮的state
、titleForState
和titleColorForState
。它有标题和标题颜色,但标题不再可见。
我尝试过的:
将按钮类型从系统更改为自定义。按钮标题仍然消失。
为按钮设置背景颜色。显示背景,标题的高度和宽度正确,但标题本身不可见。
为什么滚动后按钮标题消失了?
更新:
如果我将每个单元格的按钮标题设置为相同的字符串,则标题在滚动后仍然可见。只有当新标题与之前的标题不同时,按钮标题才会明显消失。【问题讨论】:
你能把你的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 的奇怪行为,UIButtons 消失