一旦显示在屏幕上,更改 `UITableViewCell` 的颜色
Posted
技术标签:
【中文标题】一旦显示在屏幕上,更改 `UITableViewCell` 的颜色【英文标题】:change color of `UITableViewCell` once shown in screen 【发布时间】:2018-07-10 07:57:34 【问题描述】:我想在屏幕上显示UITableViewCell
后更改它的颜色,以反映诸如已读/未读行为之类的内容。例如:
用户将看到一个列表,首先是红色,然后在一段时间后颜色应更改为 clearColor。当用户向下滚动时,新单元格应在有限的时间内再次变为红色,然后更改为 clearColor。
【问题讨论】:
你试过什么?这是相当基本的,如果您搜索它,我相信已经有答案了。 @Losiowaty 我尝试在willDisplayCell
中更改颜色,但没有帮助。感谢您的回复。
【参考方案1】:
你可以试试
斯威夫特
func tableView(_ tableView: UITableView,
willDisplay cell: UITableViewCell,
forRowAt indexPath: IndexPath)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5)
if let cel = tableView.cellForRow(at: indexPath) // not used cell directly because it may be nil at this moment
cel.backgroundColor = UIColor.red // save this state in model to avoid dequeuing problems
Objective-C
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^
UITableViewCell*cel = [tableView cellForRowAtIndexPath:indexPath];
cel.backgroundColor = [UIColor YourColor]; // won't ser it cel is nil
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^
UITableViewCell*cel = [tableView cellForRowAtIndexPath:indexPath];
cel.backgroundColor = [UIColor clearColor]; // won't ser it cel is nil
);
);
【讨论】:
这只会使颜色变为红色。一旦这些单元格延迟显示,我想将颜色更改为某种颜色。假设显示了 10 个单元格,数组有 20 个,所以这 10 个单元格首先应该是红色的,然后经过一段时间的延迟,所有这 10 个单元格都应该变成清晰的颜色,然后当用户滚动并看到第 11 个单元格时,同样应该发生。 【参考方案2】:您需要保存数据源中每一行/单元格的状态。由于单元格被重复使用,因此您不应将此数据存储在单元格本身中。我想你有某种数组作为你的 tableview 的数据源?因此,最简单的解决方案是为数据源中的每个项目添加一个属性,以存储特定项目的单元格是否已显示。
这个想法是给每个单元格一个默认颜色,并且下次滚动这个单元格进入视图时,颜色应该改变以表明它之前已经被查看过?
【讨论】:
【参考方案3】:有不同的方法。其中一种方法是创建一个全部为 false 的布尔数组,其大小将等于行数。
var array = [Bool](repeating: false, count: self.tableView.numberOfRows(inSection: 0))
// assuming only 1 section is available
在tableView(_tableView: UITableView, didSelectRowAt indexPath: IndexPath)里面,你要做的是:
array[indexPath.row] = true
在tableView(_tableView: UITableView, cellForRowAt indexPath: IndexPath)里面,可以查看布尔值并设置颜色:
if array[indexPath.row]
cell.backgroundColor = .red
else
cell.backgroundColor = .blue
【讨论】:
我没有任何选择功能。用户将看到一个列表,首先是让我们说红色,然后在一段时间后颜色应更改为 clearColor,当用户滚动时,他应该看到这些新单元格为红色,然后更改为 clearColor以上是关于一旦显示在屏幕上,更改 `UITableViewCell` 的颜色的主要内容,如果未能解决你的问题,请参考以下文章