带有Checkmark的UITableViewCell不可见

时间:2012-06-06 08:06:35

标签: objective-c ios uitableview

我在PopoverController中的UITableView出了问题。 当我触摸单元格时,调用didSelectRowAtIndexPath函数,并更改单元格accessoryType。简化示例:

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

的单元格添加屏幕截图

enter image description here

8 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分: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的回答中所述。

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

答案 3 :(得分:2)

我是最愚蠢的理由。我在故事板中创建了一个tableview,其中View Controller的大小为5.5英寸,忘记应用布局约束

然后我推出一个4英寸的手机,一切看起来很好,除了配件视图不可见,因为tableviews宽度大于手机屏幕的宽度。找出我的错误花了3个小时。

答案 4 :(得分:0)

您正在重新加载UITableView所以理论上重建了单元格,这次没有选中标记。执行以下操作:

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

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

如果要重新加载数据,则应将选定的Id存储在某个变量中,以便进行单个选择,如rowIndex,然后在

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

感谢。

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