如何在单元格选择/取消选择时正确切换 UITableViewCell 的 accesoryType?

Posted

技术标签:

【中文标题】如何在单元格选择/取消选择时正确切换 UITableViewCell 的 accesoryType?【英文标题】:How to properly toggle UITableViewCell's accesoryType on cell selection/deselection? 【发布时间】:2012-01-15 14:46:20 【问题描述】:

我正在尝试在选择/取消选择表格单元格时切换 accesoryType...行为应该是:点击 -> 将附件类型设置为 UITableViewCellAccessoryCheckmark -> 点击再次单元格 -> 回滚到 UITableViewCellAccessoryNone 类型。 我的控制器中的实现如下:

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


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

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    [cell setAccessoryType:UITableViewCellAccessoryNone];

...无论如何,一旦将样式配置为 UITableViewCellAccessoryCheckmark,我将无法将其恢复为 UITableViewCellAccessoryNone! 我也试过打电话:

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];

但不删除复选标记...我该怎么办?

编辑:实现没问题,问题出在自定义 UITableViewCell 子类中......对不起:P

【问题讨论】:

【参考方案1】:

如果这是你想要的,试试这个

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
       
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        if (cell.accessoryType == UITableViewCellAccessoryCheckmark)
        
            cell.accessoryType = UITableViewCellAccessoryNone;
        
        else
        
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        
    

【讨论】:

快速和肮脏的:cell.accessoryType ^= UITableViewCellAccessoryCheckmark :)【参考方案2】:

如果您只想将一行作为复选标记,请使用此

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

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryType = (cell.accessoryType == UITableViewCellAccessoryCheckmark) ? UITableViewCellAccessoryNone : UITableViewCellAccessoryCheckmark;
    if (_lastSelectedIndexPath != nil)
    
        UITableViewCell *lastSelectedCell = [tableView cellForRowAtIndexPath:_lastSelectedIndexPath];
        lastSelectedCell.accessoryType = UITableViewCellAccessoryNone;
    
    _lastSelectedIndexPath = indexPath;
 

【讨论】:

【参考方案3】:

再次点击单元格等同于选择单元格而不是取消选择。

您需要在- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 方法中进行切换以检查cell.accessoryType == UITableViewCellAccessoryCheckmark 是否存在。

【讨论】:

【参考方案4】:
- (void)tableView:(UITableView *)theTableView didSelectRowAtIndexPath:(NSIndexPath *)newIndexPath 
    [theTableView deselectRowAtIndexPath:[theTableView indexPathForSelectedRow] animated:NO];
    UITableViewCell *cell = [theTableView cellForRowAtIndexPath:newIndexPath];
    if (cell.accessoryType == UITableViewCellAccessoryNone) 
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        // Reflect selection in data model
     else if (cell.accessoryType == UITableViewCellAccessoryCheckmark) 
        cell.accessoryType = UITableViewCellAccessoryNone;
        // Reflect deselection in data model
    

【讨论】:

以上是关于如何在单元格选择/取消选择时正确切换 UITableViewCell 的 accesoryType?的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 在进入编辑模式时取消选择单元格

Swift 4 - 如果已选择,请取消选择集合视图单元格

重新加载表视图数据并取消选择单元格

ios UICollectionView 单元格选择和取消选择问题

在第二次点击时取消选择 UICollectionView 单元格

在表格视图中选择新行时如何取消选择选定的行?