一旦在屏幕上显示,更改UITableViewCell的颜色

时间:2018-07-10 07:57:34

标签: ios objective-c uitableview

我想在屏幕上显示UITableViewCell时更改其颜色,以反映诸如已读/未读行为的内容。例如:

用户将看到一个列表,该列表首先是红色,然后一段时间后应将颜色更改为clearColor。当用户向下滚动时,新单元格应在限定时间内再次变为红色,然后更改为clearColor。

3 个答案:

答案 0 :(得分:0)

您可以尝试

快速

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

        });

    });

}

答案 1 :(得分:0)

您需要在数据源中保存每行/单元格的状态。由于单元已被重用,因此您不应将此数据存储在单元本身中。我假设您有某种数组作为tableview的数据源?因此,最简单的解决方案是为数据源中的每个项目添加一个属性,以存储是否已显示特定项目的单元格。

是否要为每个单元格提供默认颜色,下一次将该单元格滚动到视图中时,是否应该更改颜色以表示以前已查看过该颜色?

答案 2 :(得分:0)

有不同的方法。一种方法是创建一个全为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
}