在tableView中修改UITableViewCell accessoryType的问题:didSelectRowAtIndexPath:

时间:2010-10-26 09:48:45

标签: iphone uitableview

我有一个透明的表视图(带有子视图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];
        }
    }
}

4 个答案:

答案 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中所做的所有可视单元格更改都会立即显示出来。