在ios中维护附件视图的状态

时间:2013-05-22 10:38:11

标签: ios uitableview uinavigationitem accessoryview

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

 - (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; 
   }
}

2 个答案:

答案 0 :(得分: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;
}

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

那么我在-tableView:didSelectRowAtIndexPath:中可能会做的只是在表格上-reloadData,以确保所有内容都能正确更新。

答案 1 :(得分: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"]]; 
  }  

}