1

我有一个包含多行的 TableView。每行都有不同的自定义 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;
    }   
}

请帮忙。

4

1 回答 1

2

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

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

你需要做的是:

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