如何让UITableViewCell通过点击UIBarButtonItem来改变它的背景颜色?

时间:2012-01-11 14:58:01

标签: objective-c uitableview uibarbuttonitem

我正在尝试在tableView的右下角创建一个UIBarButtonItem,以便在按下时突出显示和取消突出显示一个单元格。

简而言之,当用户按下按钮时,一系列单元格会将其背景颜色从白色更改为黄色。

但是,我没有做到这一点,因为每次按下该按钮,应用程序都会崩溃。

这是我用来创建按钮的代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    UIBarButtonItem *barButton;
    barButton = [[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"high.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(colorCells:)] autorelease];
    self.navigationItem.rightBarButtonItem = barButton; 
}

这里是为了突出显示一系列细胞:

- (void) colorCells:(id)sender
{
    UITableViewCell *cell;
    NSString *cellValue = cell.textLabel.text; 
    if ([cellValue isEqual: @"textTheCellShouldBeEqualTo"]){ 
        cell.backgroundColor = [UIColor colorWithRed:251/255.0f green:255/255.0f blue:192/255.0f alpha:1]; ; 
        cell.imageView.image = [UIImage imageNamed:@"hot.png"];

    } 
    else { 
        cell.imageView.image = nil;
        cell.backgroundColor = [UIColor whiteColor];
    } 
}

我在哪里失败?它应该工作正常。要么?我错过了什么吗?该视图是一个UITableViewController。

修改

我修改了我的代码:

- (void) colorCells:(id)sender{
    UITableViewCell *cell;
    NSInteger nSections = [self.tableView numberOfSections];
    for (int j=0; j<nSections; j++) {
        NSInteger nRows = [self.tableView numberOfRowsInSection:j];
        for (int i=0; i<nRows; i++) {
            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:j];
            cell = [self.tableView cellForRowAtIndexPath:indexPath];
        }
        NSString *cellValue = cell.textLabel.text; 
        if ([cellValue isEqual: @"textTheCellShouldBeEqualTo"] ){ 
            cell.backgroundColor = [UIColor colorWithRed:251/255.0f green:255/255.0f blue:192/255.0f alpha:1]; ; 
            cell.imageView.image = [UIImage imageNamed:@"hot.png"];

        } 
        else { 
            cell.imageView.image = nil;
            cell.backgroundColor = [UIColor whiteColor];
        } 
        [self.tableView reloadData];

    }
}

现在它不会崩溃,但它也不会为背景着色。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

基于单元格中文本的背景颜色看起来非常脆弱。是什么决定了一个细胞应该突出显示?它改变了吗?当然,背景的颜色对应于数据源中对象的特定属性。更强大的方法是在类上使用NSMutableIndexSet属性来跟踪一组行索引,需要在点击小节按钮时突出显示。

考虑这个例子。我假设rowsToHighlight是在您的类中声明的NSMutableIndexSet的实例,并且已经填充了需要突出显示的行的索引。我们将实现-tableView:willDisplayCell:forRowAtIndexPath:来调整单元格的背景颜色,具体取决于提供的索引路径是rowsToHighlight的成员。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([self.rowsToHighlight containsIndex:indexPath.row])
    {
        cell.backgroundColor = [UIColor yellowColor];
    }
}

然后在由bar按钮触发的方法中,只需执行一个空的更新块以使表格重新加载动画。

- (void)colorCells:(id)sender
{
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

答案 1 :(得分:0)

除非您告诉包含它们的表视图重新加载它们,否则不会重绘您的单元格。您可以使用以下几种方法之一来完成此操作。您可以考虑[someTableView reloadData]one of these methods

此外,您的单元格对象不是表格视图中的对象。你可能会考虑这个:

- (void) colorCells:(id)sender
{
    UITableViewCell *cell;

    //grab a cell
    cell = [self  tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:someRow inSection:someSection]];
    NSString *cellValue = cell.textLabel.text; 
    if ([cellValue isEqual: @"textTheCellShouldBeEqualTo"]){ 
        cell.backgroundColor = [UIColor colorWithRed:251/255.0f green:255/255.0f blue:192/255.0f alpha:1]; ; 
        cell.imageView.image = [UIImage imageNamed:@"hot.png"];

    } 
    else { 
        cell.imageView.image = nil;
        cell.backgroundColor = [UIColor whiteColor];
    } 

   //perhaps you need to reload the table as well
   [self.tableView reloadData];
}