如何使用UIActionSheet更改自定义UITableViewCell的颜色?

时间:2012-09-15 16:08:52

标签: iphone objective-c ios ipad

我有一个包含多行的TableView。每行都有不同的Custom UITableViewCell。我需要在UIActionSheet的帮助下更改此单元格的颜色。这意味着当我选择一行时,应弹出一个Actionsheet,要求为该单元格选择特定的颜色。另一个重要的事情是,即使细胞离开屏幕,细胞仍应保留颜色。

这是我的代码。我的代码的问题是单元格没有实时更新。如果我再次选择该行,则单元格的颜色会更新。另一个问题是,如果我向下滚动单元格颜色更改为默认白色。

UIColor *cellColour;

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    switch (indexPath.row)
       {
        case 0:
            [self displayActionSheet];
            cell.backgroundColor=cellColour;
            break;
        case 1:
            cell.backgroundColor=[UIColor yellowColor];
            break;
        default:
            break;
    }
}

-(void) displayActionSheet
{
    UIActionSheet *popupQuery = [[UIActionSheet alloc] initWithTitle:@"Select row colour"   delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Red",@"Green",nil];

    popupQuery.actionSheetStyle = UIActionSheetStyleDefault;

    [popupQuery showInView:self.view];

    [popupQuery release];
}

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
switch (buttonIndex)
    {
      case 0:
        NSLog(@"Red");
        cellColour=UIColor.redColor;
        break;
      case 1:
        NSLog(@"Green");
        cellColour=UIColor.greenColor;
        break;
      case 2:
        NSLog(@"Pressed Cancel");
        cellColour=nil;
        break;
      default:
        break;
    }   
}

请帮忙。

1 个答案:

答案 0 :(得分:2)

这是正常的,因为UIActionSheet行为是异步的。

当您致电displayActionSheet时,它会在屏幕上显示UIActionSheet,然后继续执行代码(无需等待用户点击操作表的按钮)。然后,当用户点击操作表的某个按钮时,将调用委托方法actionSheet: clickedButtonAtIndex:

您需要做的是:

  • 使用cellColor属性(我希望实际上它是您班级的@property,而不是tableView:cellForRowAtIndexPath:中问题代码中的全局变量!方法(在此处设置cell.backgroundColor = cellColour;),以便每次重复使用单元格并在屏幕上显示时使用颜色
  • 当用户在操作表中选择了一种颜色以便更新单元格颜色时,在[tableView reloadData]委托方法中调用actionSheet:clickedButtonAtIndex:以重新加载tableView。