如何动态更改UITableViewCell的背景颜色?

时间:2011-12-02 02:16:00

标签: iphone objective-c cocoa-touch uitableview

我有一个变量可以跟踪需要着色的细胞数量。因此,如果该变量为3,那么前三个单元格backgroundcolor将会改变。我怎么能这样做?

我知道我需要在

中更新此内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

但是如何根据我的变量确保顶部单元格具有不同的背景颜色?

4 个答案:

答案 0 :(得分:2)

indexPath参数是您的起点。如果coloredCells是一个包含要着色的单元格数的整数,那么您的方法将包含类似

的内容
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
    // fetch or create the cell, first
    UITableViewCell *cell = // ... 

    // then set it up
    if(indexPath.row < self.coloredCells) {
        cell.contentView.backgroundColor = [UIColor redColor];
    } else {
        cell.contentView.backgroundColor = [UIColor whiteColor];
    }

    // perform rest of cell setup
    // ...

    return cell;
}

现在,如果您调整coloredCells的值,则需要通知表视图其某些视图已更改。最懒的方法是重新加载整个表:

// elsewhere...
self.coloredCells = 4;
[self.tableView reloadData];

或者您可以花一点力气重新加载具有彩色背景的细胞:

self.coloredCells = newColoredCount;
NSMutableArray *indexPaths = [NSMutableArray arrayWithCapacity:newColoredCount];
for(int i = 0; i < newColoredCount; i++) {
    [indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]];
}
[self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];

答案 1 :(得分:0)

您将测试行号并相应地更改颜色。在cellForRowAtIndexPath中使用:

 //having allocated or recycled a cell into myCell pointer above
 //test for row and assign background color like so

if (indexPath.row < 3) {
  myCell.contentView.backgroundColor = [UIColor greenColor];
 } else {
  myCell.contentView.backgroundColor = [UIColor redColor];
 }

 //continue configuring your cell

答案 2 :(得分:0)

您可以使用UITableViewDelegate的tableView:willDisplayCell:forRowAtIndexPath:来更改单元格的背景颜色等内容。在实际显示单元格之前,cellForRowAtIndexPath中所做的更改可能会丢失,因此通常最好在此方法中执行此操作。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if(indexPath.row < numberOfColoredRows) {
        cell.backgroundColor = [UIColor redColor];
    }
}

从参考文献中对此方法的讨论:

  

表视图在使用之前将此消息发送到其委托   单元格绘制一行,从而允许委托自定义   显示之前的单元格对象。这个方法给代表一个   有可能覆盖表格前面设置的基于状态的属性   视图,例如选择和背景颜色。代表之后   返回时,表视图仅设置alpha和frame属性,以及   然后只有当它们滑入或滑出时动画行。

答案 3 :(得分:0)

不,您不必更新tableView:cellForRowRowAtIndexPath:委托方法。你所要做的就是:

[self.tableView cellForRowAtIndexPath:indexPath].backgroundColor = desiredUIColor;

请注意,从tableView:cellForRowAtIndexPath:类型调用id<UITableViewDataSource>与从类型cellForRowAtIndexPath:调用UITableView不同。前者调用委托方法(永远不应该直接调用),后者返回索引路径的当前单元格而不重新计算单元格

如果表视图中只有一个部分,则计算顶部 n 单元格的算法很简单。如果你的“要跟踪需要着色的细胞数量的变量”是(NSUInteger)numberOfHighlightedCells,那么这是一个可以运行的简单循环代码:

NSUInteger i;

for (i = 0; i < numberOfHighlightedCells; i++) {
    [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]].backgroundColor = desiredUIColor;
}

但是,如果表中有多个部分,则可能需要对索引路径进行一些非常复杂的计算。