带有复选标记的 UITableViewCell 不可见

Posted

技术标签:

【中文标题】带有复选标记的 UITableViewCell 不可见【英文标题】:UITableViewCell with Checkmark not visible 【发布时间】:2012-06-06 08:06:35 【问题描述】:

我在 PopoverController 中的 UITableView 有问题。 当我触摸单元格时,会调用 didSelectRowAtIndexPath 函数,并更改单元格附件类型。示例简化:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewCell *cell = [self.listItems objectAtIndex:indexPath.row];
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
    [self.tableView reloadData];
    [self.popoverController dismissPopoverAnimated:YES];

它工作正常,单元格被选中,但它在我的 tableview 上不可见:我看不到蓝色复选标记。但是,在单元格的触摸状态下,复选标记显示为白色(单元格背景为灰色)。但在默认状态下不可见。

你知道为什么我的复选标记在默认状态下不可见吗?

谢谢,

编辑:为带有accessoryType = UITableViewCellAccessoryCheckmark的单元格添加屏幕截图

【问题讨论】:

对于默认状态,你必须把 cell.accessoryType = UITableViewCellAccessoryCheckmark;里面 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法。 是的,我放了它,它正在工作。我的问题出在显示器上... 现在默认情况下正在工作,并显示缺少的内容 这里:在默认状态下,复选标记不可见,但单元格仍然有accessoryType = UITableViewCellAccessoryCheckmark。复选标记仅在我触摸单元格时可见。 你明白了吗?我有完全相同的问题。 【参考方案1】:

当我将全局色调颜色更改为白色时,这发生在我身上。一旦我意识到,我进入 UITableView 并在本地更改此表的色调颜色。固定。

【讨论】:

这帮助我解决了我的问题。如果其他人有这个问题并且想要保持全局色调颜色设置,只需在 TableView 类的 viewDidLoad() 中更改色调:self.view.tintColor = UIColor.blackColor()【参考方案2】:

我已经尝试过 Jacky Boy 的答案 - 没有帮助。但是取消选择中有一些东西......

所以我尝试在添加复选标记附件之前取消选择 didSelectRowAtIndexPath: 中的单元格:

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

   [tableView deselectRowAtIndexPath:indexPath animated:YES];
   UITableViewCell* selectedCell = [tableView cellForRowAtIndexPath:indexPath];

   if (row != _selectedRow) 

       if (selectedCell.accessoryType == UITableViewCellAccessoryNone) 

          selectedCell.accessoryType = UITableViewCellAccessoryCheckmark;
          _selectedRow = row;

        else if (selectedCell.accessoryType == UITableViewCellAccessoryCheckmark) 

          selectedCell.accessoryType = UITableViewCellAccessoryNone;
       
       [tableView reloadData];
   

对我来说它终于奏效了——漂亮的深色复选标记现在在单元格上清晰可见!

当然 cellForRowAtIndexPath: 中有一个部分,类似于 arexx 的回答中描述的。

【讨论】:

【参考方案3】:

我遇到了类似的问题,在重新加载带有复选标记设置为附件的行后,复选标记将不可见(但在选择该行时会以白色显示)。在围绕该问题进行测试时,我发现复选标记始终存在于单元格中,它只是白底白字。

我对问题的理解是,当我要求重新加载单元格时(以便我可以用复选标记显示它),现有单元格被放入重用队列,但当时处于选中状态(因为用户刚刚选择了它)。当单元格从重用队列中返回并且您在 tableView:cellForRowAtIndexPath 中重新配置它时,它仍处于选定状态,并且因为它已被选中,所以附件设置为白色而不是可见颜色。

为了解决这个问题,我在 tableView:cellForRowAtIndexPath 中添加了一行来强制不选择单元格。现在,当显示新单元格时,配件始终可见。

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

    // Get a reusable cell - this only works with Storyboard prototype cells 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];

    // THE MAGIC BIT
    // Force the cell to not be in a selected state.    
    cell.selected = NO;
    // END MAGIC BIT

    if (indexPathIsPathOfSelectedRow) 
         // This is the selected cell, so show the checkmark accessory.
         cell.accessoryType = UITableViewCellAccessoryCheckmark;
     else 
         // In case we're reusing a cell that previously showed a checkmark, clear it.
         cell.accessoryType = UITableViewCellAccessoryNone;
    

    return cell;

【讨论】:

【参考方案4】:

我的理由是最愚蠢的。我在情节提要中创建了一个表格视图,其视图控制器大小为 5.5 英寸,忘记应用布局约束

然后我在一个 4 英寸的手机上启动,一切看起来都很好,除了附件视图不可见,因为 tableviews 宽度大于手机屏幕的宽度。我花了 3 个小时才发现我的错误。

【讨论】:

【参考方案5】:

您正在重新加载UITableView,因此理论上单元会重新创建,这次没有复选标记。执行以下操作:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewCell *cell = [self.listItems objectAtIndex:indexPath.row];
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
    [self.popoverController dismissPopoverAnimated:YES];

【讨论】:

很公平,那么您需要以某种方式标记该特定单元格。所以当UITableView被重新加载时,复选标记仍然存在。您可以保留对indexPath 的引用,并在cellForRowAtIndex 中进行检查。 这不是问题,在我的cellForRowAtIndexPath 中,我验证并在必要时添加复选标记。我的问题出在显示器上,而不是功能上。 嗯,如何创建单元格?【参考方案6】:

ios 6.1 下运行,我看到的行为是一个几乎白色背景上带有白色复选标记的单元格。这似乎是因为绘制复选标记附件的代码认为单元格处于突出显示状态,因此不是以正常的蓝色绘制复选标记,而是以白色绘制。

设置单元格的选定状态对我不起作用,但在设置附件类型之前立即设置突出显示状态。有了以下内容,我总是得到一个深蓝色的复选标记。

cell.highlighted = NO;
if (checked)
    self.accessoryType = UITableViewCellAccessoryCheckmark;
else
    self.accessoryType = UITableViewCellAccessoryNone;

【讨论】:

【参考方案7】:

如果你想重新加载数据,那么你应该将选定的 Id 存储在某个变量中以进行单个选择,例如 rowIndex,然后在

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    //check index
    if (rowIndex==indexPath.row)
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        
        else
            cell.accessoryType = UITableViewCellAccessoryNone;
        

谢谢。

【讨论】:

【参考方案8】:
-(UIImageView *)checkmarkImg
    UIImage *image = [[UIImage imageNamed:@"ic_check_black_24dp.png"] changeColor:CLR_BUY];
    UIImageView *checkmark = [[UIImageView alloc] initWithImage:image];
    return  checkmark;


        cell.accessoryView = [self checkmarkImg];

【讨论】:

以上是关于带有复选标记的 UITableViewCell 不可见的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 无意中在不需要的行上放置了复选标记

如何在iOS 7上的UITableViewCell左侧获得复选标记,就像在设置中一样?

删除复选标记

在 Swift 中保存 UITableViewCell 复选标记选择

如何显示 UITableViewCell 附件复选标记

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