6

我在 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

在此处输入图像描述

4

8 回答 8

11

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

于 2014-01-08T01:47:10.807 回答
3

我试过答案 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 的答案中描述的。

于 2012-11-22T06:19:49.223 回答
2

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

我对这个问题的理解是,当我要求重新加载单元格时(以便我可以用复选标记显示它),现有单元格被放在重用队列中,但当时处于选中状态(因为用户刚刚选择了它)。当单元格从重用队列中返回并且您在 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;
}
于 2012-11-21T16:01:02.137 回答
2

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

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

于 2016-04-07T04:57:43.637 回答
0
-(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];
于 2014-12-19T16:45:30.343 回答
0

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

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

谢谢。

于 2013-10-02T07:10:38.720 回答
0

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

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [self.listItems objectAtIndex:indexPath.row];
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
    [self.popoverController dismissPopoverAnimated:YES];
}
于 2012-06-06T08:20:06.343 回答
0

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

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

cell.highlighted = NO;
if (checked)
    self.accessoryType = UITableViewCellAccessoryCheckmark;
else
    self.accessoryType = UITableViewCellAccessoryNone;
于 2013-05-28T17:28:39.293 回答