我在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
答案 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)
然后我推出一个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];