我有一个透明的表视图(带有子视图UIImageView的UIViewController,以及带有background = clearColor,UITableViewCells background = clearColor的UIImageView兄弟之上的另一个子视图UITableView)。我还希望点击单元格以在checkmark和none之间切换单元格的accessoryType。如果我在tableView:didSelectRowAtIndexPath:中修改UITableViewCell的accessoryType,有时(30-50%的时间,在ios4.1模拟器和运行os4.1的3GS iphone上)当从accessoryType无切换到accessoryType时勾选复选标记图像被涂在不透明的白色背景上,而不是透明的背景。如果我重新加载表(其中accessoryType也适用于每个单元格),透明度可以100%正常工作。
这是一个错误吗?或者正在修改tableView中的单元格:didSelectRowAtIndexPath:不是正确的事情,应该重新加载该行?或者还有其他我想念的东西?
编辑:这是我的didSelectRowAtIndexPath代码,显示了不良行为:
编辑2:正在发生的事情的更多细节。这是问题发生时取消选择动画的尾端。选中标记出现并正确显示&取消选择动画正在运行并且蓝色选择逐渐淡出时透明地显示。在取消选择动画完成并且蓝色全部消失后,可能在选择颜色完全消失后的1/10秒内,当复选标记附件“自动”变为不透明而没有进一步的用户输入时。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if ( self.editing )
{
}
else
{
[self.myTableView deselectRowAtIndexPath:indexPath animated:YES];
UITableViewCell *cell = [self.myTableView cellForRowAtIndexPath:indexPath];
// toggle the selection status of the selected row
//
NSNumber *rowObj = [NSNumber numberWithUnsignedInt:indexPath.row];
if ( [self.selectedRows containsObject:rowObj] )
{
// currently selected, now de-select
//
cell.accessoryType = UITableViewCellAccessoryNone;
[self.selectedRows removeObject:rowObj];
}
else
{
// currently unselected, now select
//
cell.accessoryType = UITableViewCellAccessoryCheckmark;
[self.selectedRows addObject:rowObj];
}
}
}
答案 0 :(得分:2)
如果您将 toogle选择代码移动到
,我认为它更清晰-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
并在 didSelectRowAtIndexPath 上调用
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
这样,只要选中它就会重新加载选定的行,而不需要调用reloadData。 希望这有帮助!
答案 1 :(得分:1)
这篇文章在4个月内没有更新,但我想我会提交我的解决方案,因为它似乎有用,可以帮助其他人解决类似的问题。
所有事情都发生在didSelectRowAtIndexPath方法中。我调用的self.view是一个tableView(所以用tableView的名称替换它,例如self.tableView)
// let's go through all the cells to update them as I only want one cell at a time to have the checkmark next to it
for (int i=0; i<[self.detailsArray count]; i++) {
// whenever we reach the cell we have selected, let's change its accessoryType and its colour
if (i == indexPath.row) {
// that's the row we have selected, let's update its
UITableViewCell *cell = [self.view cellForRowAtIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
cell.textLabel.textColor = [UIColor colorWithRed:51.0f/255.0f green:102.0f/255.0f blue:153.0f/255.0f alpha:1.0f];
}
// if it isn't the cell we have selected, let's change it back to boring dark colour and no accessoryType
else {
UITableViewCell *cell = [self.view cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
cell.accessoryType = UITableViewCellAccessoryNone;
cell.textLabel.textColor = [UIColor darkTextColor];
}
}
// don't forget to deselect the row
[self.view deselectRowAtIndexPath:indexPath animated:YES];
答案 2 :(得分:0)
这个UITableViewDelegate方法:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
在显示单元格之前调用。修改你的配件视图应该有效。
答案 3 :(得分:0)
在使用自定义表格行选择动画调试不相关项目中的另一个问题时,我发现如果单元格选择样式不是UITableViewCellSelectionStyleNone,那么对didSelectRowAtIndexPath中执行的单元格的任何更改都会受到毛刺和其他理想结果的影响(对单元格N所做的更改不会出现,直到单元格!= N稍后被选中,并且对单元格执行的动画根本不会显示出来。当我将选择样式更改为UITableViewCellSelectionStyleNone时,didSelectRowAtIndexPath中所做的所有可视单元格更改都会立即显示出来。