如何在UITableView中控制所选单元格的背景颜色

时间:2013-07-11 15:49:15

标签: ios uitableview

我使用UITableView作为首选项屏幕,其中行代表用户选择 我正在使用NSUserDefaults维护选择。我的问题是我正在尝试为单元格创建一个特殊的外观,我通过构建一个特殊的颜色并在下面的代码中使用它来做:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];

    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"];
    }
    cell.textLabel.text = [myArray objectAtIndex:[indexPath row]];
    UIView *selectionColor = [[UIView alloc] init];
    selectionColor.backgroundColor = [UIColor colorWithRed:(200/255.0) green:(200/255.0) blue:(200/255.0) alpha:0.6];
    cell.selectedBackgroundView = selectionColor;
    cell.textLabel.textColor = [UIColor grayColor];
    return cell;
    }

基于此,当用户点击发生时,它会显示我在此事件中构建的灰色,这就是我想要的。当用户取消选择它时,灰色背景颜色消失。

现在我需要添加NSUserDefaults,以检查该单元格是否已保存。事件现在变成了这个:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];

    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"];
    }
    cell.textLabel.text = [myArray objectAtIndex:[indexPath row]];
    UIView *selectionColor = [[UIView alloc] init];
    selectionColor.backgroundColor = [UIColor colorWithRed:(200/255.0) green:(200/255.0) blue:(200/255.0) alpha:0.6];
    cell.selectedBackgroundView = selectionColor;
    cell.textLabel.textColor = [UIColor grayColor];
    if([[NSUserDefaults standardUserDefaults] valueForKey:selectedOption]) {
        //Here, how can I make the cell look grayish in the background? 
        //If I do cell.selected = true// the cell shows a black background color 
     }
    return cell;
    }

如果我打电话给cell.selected = true,则单元格背景为黑色而不是我想要的。 我不知道应该在哪里执行此自定义。

更新: 根据rdelmar的回答,我更新了cellForRowAtIndexPath并添加了自定义代码

 if (myArray[indexPath.Row][selectionState] == YES){
UIView *selectionColor = [[UIView alloc] init];
selectionColor.backgroundColor = [UIColor colorWithRed:(200/255.0) green:(200/255.0) blue:(200/255.0) alpha:0.6];
cell.selectedBackgroundView = selectionColor;
cell.textLabel.textColor = [UIColor grayColor];

}else{
cell.selectedBackgroundView = nil;
cell.textLabel.textColor = [UIColor blackColor];

}

仍然没有;'r解决了这个问题,这意味着它将通过验证l(selectionState == yes,并点击代码来更改背景视图的颜色,但是在显示它时仍然会保持不变。

我找到了这个方法willDisplayCell,我在那里移动了关于习惯化的代码,仍然没有工作!!

- (UITableViewCell *)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
 if (myArray[indexPath.Row][selectionState] == YES){
    UIView *selectionColor = [[UIView alloc] init];
    selectionColor.backgroundColor = [UIColor colorWithRed:(200/255.0) green:(200/255.0) blue:(200/255.0) alpha:0.6];
    cell.selectedBackgroundView = selectionColor;
}
else{
    cell.selectedBackgroundView = nil;
    cell.textLabel.textColor = [UIColor blackColor];
}
return cell;
}

我是否应该拦截另一个事件或方法?

1 个答案:

答案 0 :(得分:0)

我不确定您是否要在用户默认设置中执行此操作 - 如果您这样做,您必须以某种方式跟踪数组中的索引(为单元格提供数据)选定的单元格对应于。

我会将myArray的结构更改为具有两个键的字典数组,一个用于数据,一个用于单元格的选择状态。您将在didSelectRowAtIndexPath和didDeselectRowAtIndexPath中更新单元格状态的值。然后,在cellForRowAtIndexPath中,检查该单元格状态键的值(让我们称之为selectionState):

if (myArray[indexPath.Row][selectionState] == YES){
    UIView *selectionColor = [[UIView alloc] init];
    selectionColor.backgroundColor = [UIColor colorWithRed:(200/255.0) green:(200/255.0) blue:(200/255.0) alpha:0.6];
    cell.selectedBackgroundView = selectionColor;
    cell.textLabel.textColor = [UIColor grayColor];
}else{
    cell.selectedBackgroundView = nil;
    cell.textLabel.textColor = [UIColor blackColor];
}

当然,您必须将阵列本身保存到磁盘以使单元状态值保持不变。