如何更改所有UITableViewCells的背景颜色

时间:2012-04-18 16:03:47

标签: iphone objective-c ios ipad uitableview

我有一个非常简单的视图控制器,只有UITableViewUIButton,点按按钮时,我想将所有UITableViewCells的背景颜色更改为绿色,假设有一些细胞不可见,我用这个循环来完成我需要的东西:

 - (IBAction)click:(id)sender {

for (int row = 0; row < [self.tableView numberOfRowsInSection:0]; row++)  {

    NSIndexPath* cellPath = [NSIndexPath indexPathForRow:row inSection:0];
    UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:cellPath];

    cell.backgroundColor = [UIColor greenColor];

 }

}

问题在于UITableView的默认行为,它实际上并不会创建不可见的单元格,直到它们可见!所以上面的代码不幸仅适用于可见细胞。问题是,如何在按钮点击时更改所有单元格的颜色?

P.S。这个非常简单的项目样本can be downloaded here

提前谢谢。

6 个答案:

答案 0 :(得分:4)

你不必这样做

只需使用变量来保存单元格的backgroundColor

UIColor cellColor;

然后当您更改颜色调用时

[tableView reloadData];

然后在

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     UITableViewCell *cell = yourcell;

     ...
     ...
     ...

     cell.backgroundColor = cellColor;

     return cell ;
}

已经完成了!

<强>更新

抱歉,试试这个

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     UITableViewCell *cell = yourcell;

     ...
     ...
     ...
    cell.textLabel.backgroundColor = [UIColor clearColor];
UIView* bgview = [[UIView alloc] initWithFrame:cell.bounds];
bgview.backgroundColor = [UIColor greenColor];
    [cell setBackgroundView:bgview];

     return cell ;
}

答案 1 :(得分:2)

您想使用UITableViewDataSource来处理这个问题,所以只需在.h文件中创建一个UIColor变量,更改操作中的变量并告诉tableView重新加载它的数据,然后在数据源响应中设置颜色

MyTableViewController.h

@interface MyTableViewController : UITableViewController {
    UIColor *cellColor;
}
-(IBAction)click:(id)sender;

MyTableViewController.m

@implementation MyTableViewController

    -(IBAction)click:(id)sender{
        cellColor = [UIColor redColor];
        [self.tableView reloadData];
    }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // Setup your cell
        cell.textLabel.backgroundColor = [UIColor clearColor];
        cell.detailTextLabel.backgroundColor = [UIColor clearColor];
        cell.accessoryView.backgroundColor = [UIColor clearColor];
        cell.contentView.backgroundColor = cellColor;
        return cell;
    }

@end

答案 2 :(得分:1)

将颜色存储为保留的property,并在单击按钮时进行设置。

@property (retain, nonatomic) UIColor *cellColor;

....

- (IBAction)click:(id)sender {
    self.cellColor = [UIColor greenColor];

    for (int row = 0; row < [self.tableView numberOfRowsInSection:0]; row++)  {

        NSIndexPath* cellPath = [NSIndexPath indexPathForRow:row inSection:0];
        UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:cellPath];

        cell.contentView.backgroundColor = self.cellColor;
        cell.textLabel.backgroundColor = self.cellColor;
    }

}

您也可以选择重新加载整个tableView,而不是遍历单元格。

- (IBAction)click:(id)sender {
    self.cellColor = [UIColor greenColor];    
    [self.tableView reloadData];
}

然后在tableView:cellForRowAtIndexPath:检查property是否已设置并设置contentViewtextLabel背景颜色。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    if (self.cellColor) {
        cell.contentView.backgroundColor = self.cellColor;
        cell.textLabel.backgroundColor = self.cellColor;
    }
    return cell;
}

答案 3 :(得分:1)

你在评论保罗亨特的答案中说“不会给整个细胞着色”。

尝试设置backgroundView:

cell.backgroundView = [[[UIView alloc] init] autorelease]; 
cell.backgroundView.backgroundColor = self.cellColor;

答案 4 :(得分:1)

在您的代码中只需更改此方法

可能这是你的临时解决方案

-(IBAction)click:(id)sender 
{

    self.tableView.backgroundColor=[UIColor greenColor];

}

答案 5 :(得分:0)

此链接可以解决您的问题,它有类似您的问题 Setting background color of a table view cell on iPhone