1

我有一个动态表,用户可以在其中添加和删除数据。该表显示购物清单。如果购物完成,用户应该能够勾选所需的项目并且也应该能够取消勾选,我通过设置附件按钮来实现这一点。但是,当我从中删除一行时,问题就来了,单元格被删除,但是附加到该单元格的附件按钮保持在相同的状态。

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
  cell = [tableView cellForRowAtIndexPath:indexPath]; 
   if (cell.accessoryView == nil)
   {    
    cell.accessoryView= [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick_btn"]]; } else { cell.accessoryView = nil; 
   }
}
4

2 回答 2

0

因为UITableView' 通常重用 ' 的实例,所以UITableViewCell您必须确保 '-tableView:cellForRowAtIndexPath:方法正确设置单元格的所有属性。其他陈旧的数据可能会持续存在。我猜这可能是您的问题,缺乏对您的代码的完整了解。

所以,像这样:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString*    cellIdentifier = @"TheCellIdentifier";
    UITableViewCell*    cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }

    ShoppingObject* shopping = [self.myShoppingList objectAtIndex:indexPath.row];
    UIImageView*    accessoryView = nil;

    if (shopping.isDone) {
        accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick_btn"]];
    }

    cell.accessoryView =  accessoryView;

    return cell;
}

它通过重用缓存或创建新缓存来获取单元。然后它会检查您的数据模型的状态,以查看该行中表示的对象是否已完成购物,如果购物已完成,则为您提供图像。请注意,未完成购物,没有创建任何附件视图,因此无论在该表行中表示的 ShoppingObject 的状态如何,都将正确设置该单元格的附件视图。

所以我可能会在你的情况下做的-tableView:didSelectRowAtIndexPath:就是简单地-reloadData放在桌子上以确保一切都正确更新。

于 2013-05-22T11:43:50.127 回答
0

您需要跟踪所选项目

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
  cell = [tableView cellForRowAtIndexPath:indexPath]; 
   if (cell.accessoryView == nil)
   {    
    cell.accessoryView= [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick_btn"]]; 
    [self.checkedIndexPaths addObject:indexPath];
   } 
   else { 
   cell.accessoryView = nil; 
   [self.checkedIndexPaths removeObject:indexPath];
   }

}   

编辑

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{

// Do other stuffs

cell.accessoryView = nil;

if ([self.checkedIndexPath containsObject:indexPath]) {
   cell.accessoryView= [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick_btn"]]; 
  }  

}
于 2013-05-22T12:15:09.617 回答