Iphone 修改tableView中的UITableViewCell访问类型时出现问题:DidSelectRowatineXpath:

Iphone 修改tableView中的UITableViewCell访问类型时出现问题:DidSelectRowatineXpath:,iphone,uitableview,Iphone,Uitableview,我有一个透明的表视图(带有子视图UIImageView的UIViewController,以及位于UIImageView同级之上的另一个子视图UITableView,背景=clearColor,UITableViewCells背景=clearColor)。我还想点击单元格,在复选标记和无之间切换单元格的accessoryType。如果我在tableView:DidSelectRowatingIndexPath:中修改UITableViewCell的accessoryType,有时(在ios4.1

我有一个透明的表视图(带有子视图UIImageView的UIViewController,以及位于UIImageView同级之上的另一个子视图UITableView,背景=clearColor,UITableViewCells背景=clearColor)。我还想点击单元格,在复选标记和无之间切换单元格的accessoryType。如果我在tableView:DidSelectRowatingIndexPath:中修改UITableViewCell的accessoryType,有时(在ios4.1模拟器和运行os4.1的3GS iphone上,30-50%的时间)从accessoryType None切换到accessoryType复选标记时,复选标记图像将在不透明的白色背景而不是透明背景下绘制。相反,如果我重新加载表(其中accessoryType也针对每个单元格进行了适当设置),则透明度在100%的时间内都能正常工作

这是虫子吗?或者修改tableView:didSelectRowAtIndexPath:中的单元格不是正确的做法,而是应该重新加载该行?还是我还遗漏了什么

编辑:下面是我的DidSelectRowatineXpath代码,它显示了不希望出现的行为:

编辑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];
        }
    }
}

此UITableViewDelegate方法:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

在显示单元格之前调用。在那里修改附件视图应该会起作用。

在使用自定义表格行选择动画调试无关项目中的另一个问题时,我发现如果单元格选择样式不是UITableViewCellSelectionStyleNone,然后,在didSelectRowAtIndexPath中对单元格所做的任何更改都会出现小故障和其他需要的结果(对单元格N所做的更改直到稍后选择单元格!=N后才会显示,并且在单元格上执行的动画根本不会显示)。当我将选择样式更改为UITableViewCellSelectionStyleNone时,在DidSelectRowatingIndexPath中所做的所有可视单元格更改都会立即显示出来,不会出现问题。

我认为如果将toogle选择代码移到

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
并在didSelectRowAtIndexPath上调用

这样,您将在选定行后仅重新加载该行,而无需调用reloadData。
希望这有帮助

这篇文章已经4个月没有更新了,但我想我会提交我的解决方案,因为它似乎有效,可以帮助其他人解决类似的问题

一切都发生在didSelectRowAtIndexPath方法中。我调用的self.view是一个tableView(因此用您的tableView的名称替换它,例如self.tableView)

//让我们检查所有单元格以更新它们,因为我一次只希望一个单元格旁边有复选标记

for(int i=0;iok发布了didSelectRowAtIndexPath(“断开”)代码。如果我注释掉cell.accessoryType行并在底部添加一个[tableView重载],那么透明性总是有效的。是否通过手动调用[self.myTableView cellForRowAtIndexPath:indexath]来修改单元格;完全是假的?我在网上的一些代码中看到了它(“所以这一定是真的!”)并复制了它。有没有任何保证UITableView会尊重以这种方式对单元格所做的更改?根据我所看到的,答案似乎是“不一定”…谢谢你的消息,鲍勃,但我看不出你的回答对我有什么帮助。正如我所写的,我总是可以调用[TableView reloadData]为了获得正确的操作,因为我的cellForRowAtIndexPath正确分配了附件。我的问题是:我可以在选择时更改单元格并期望单元格正确更新吗?请注意,当我在didSelectRowAtIndexPath中更改附件时,附件确实发生了更改,但有一个可见的“小故障”"关于透明度。我需要解决这两点中的一点。我没有用最近的SDK重新检查场景,可能我在自我回答中指出的情况已经得到修复,但请注意,我发现在更新DidSelectRowatineXpath中的表行时出现了小故障,除非选择样式为UITableViewCellSelectionStyleNone。我还注意到您调用Decelrowatindexpath:animated:在您的视觉更改之后,而我之前调用它。是的,您对UITableViewCellSelectionStyleNone的选择是正确的,我确实必须将单元格更改为此样式才能更新:)至于Decelrowatindexpath:您可以将其放置在任何位置,它不会改变任何内容。
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
// 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];