隐藏 UITableViewCell 时,accessoryType 复选标记消失

Posted

技术标签:

【中文标题】隐藏 UITableViewCell 时,accessoryType 复选标记消失【英文标题】:accessoryTypeCheckmark dissapears when UITableViewCell is hidden 【发布时间】:2011-03-16 10:11:05 【问题描述】:

我正在创建一个函数来跟踪截止日期。当您在截止日期表视图中选择一行时,我将 accessoryType 更改为 Checkmark。这与此代码完美配合:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

    Cell *selectedCell = (Cell *)[tableView cellForRowAtIndexPath: indexPath];

    if (selectedCell.accessoryType == UITableViewCellAccessoryNone) 
        [Deadline setDone: TRUE onIndex:indexPath.row];
        selectedCell.accessoryType = UITableViewCellAccessoryCheckmark;

     else 
        [Deadline setDone: FALSE onIndex:indexPath.row];
        selectedCell.accessoryType = UITableViewCellAccessoryNone;
    

    [tableView deselectRowAtIndexPath:indexPath animated: YES];

当您选择了一个表格单元格并滚动它消失时,会出现问题,当它再次出现时,accessoryType 再次为 None。

我在 cellForRowAtIndexPath 中决定附件类型的代码是:

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

    static NSString *CellIdentifier = @"CellIdentifier";

    Deadline *d = [self.arrDeadlines objectAtIndex:indexPath.row];

    Cell *currCell = (Cell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (currCell == nil) 
    
        UIViewController *c = [[UIViewController alloc] initWithNibName:@"Cell" bundle:nil];
        currCell = (Cell *)c.view;
        [c release];        
    

    currCell.lblTitle.text = d.name;    

    currCell.accessoryType = d.done == TRUE ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;

    return currCell;

我该如何解决这个问题?

【问题讨论】:

1) 回滚完成后,deadline.done 返回什么值? 2) 显示更多cellForRowAtIndexPath的代码。您如何管理单元格的出列? 1) 即使我选择单元格然后取消选择单元格,它总是相同的,因为我无法运行 [tableView reloadData]。 2) 源码在上面更新了! 【参考方案1】:

您不应该使用 TableViewCell 来保存数据。 这是您的数据源的用途,TableViewCell 只是数据源中数据的可见表示。

由于单元格在不再显示后被重复使用,所有数据都会被重置。

因此,在您的 UItableViewDataSoucre 中,您应该检查任务是否已完成并将accessoryType 设置为复选标记。

所以在 cellForIndexPath 方法中添加一个 NSLog 并检查 done 布尔值是否真的设置了。

【讨论】:

在我的 didSelectRowAtIndexPath 方法中更新了数据源后,我需要重新加载数据源以了解行的值是否已更新,对吗?因为现在,如果我选择一行以显示复选标记,然后滚动以使单元格不显示,然后向后滚动复选标记就消失了!这是因为我没有重新加载数据源?恐怕我不太明白你的回答。 如果它是数据的 op 副本,您应该重新加载数据源。它看起来是,arrDeadlines 看起来像一个数组,它可能是您设置完成状态的数组的副本。 你说的太对了。我像以前一样在 viewDidLoad 中制作了一个副本,我从未使用过更改附件类型。现在我使用 [Deadline getDeadlines] 为我的项目分配一个数组。你怎么看:我应该从 getDeadlines 方法自动释放数组,然后使用 [[Deadline getDeadlines] retain] 还是你会怎么做?谢谢你解决了我的问题! 自动释放方法创建但不拥有的对象是一种很好的做法。如果您的数据源正在使用属性(非原子,保留),那么您应该没问题。

以上是关于隐藏 UITableViewCell 时,accessoryType 复选标记消失的主要内容,如果未能解决你的问题,请参考以下文章

隐藏 UITableViewCell 时,accessoryType 复选标记消失

从 UITableViewCell 隐藏删除按钮

使用 AutoLayout 将 UIView 隐藏在单元格内时,不适合 UITableViewCell 高度

使用自定义 uitableViewCell 按下回车键或单击 uitableView 时隐藏键盘

如何在 UITableViewCell 单元格中隐藏具有大小的按钮?

如何在自动布局中使用 UITableViewCell 的动态高度并在底部视图隐藏时将其他视图向上移动?