在 UITableViewCell 的突出显示上更改附件视图

Posted

技术标签:

【中文标题】在 UITableViewCell 的突出显示上更改附件视图【英文标题】:Changing accessoryView on highlight of UITableViewCell 【发布时间】:2013-03-28 20:52:47 【问题描述】:

我正在尝试让我的 UITableViewCell 更改其在突出显示时的附件视图。因此,突出显示时配件会更暗。到目前为止,我已经设法使它工作得很好,但有一个例外。当按下一个单元格时,它会导致该单元格突出显示,但是当按下该按钮并取消突出显示时,accessoryView 会保留其突出显示的图像。

有什么方法可以检测突出显示是否被取消,以便我可以将附件视图改回应有的状态?我是否需要创建 UITableViewCell 的子类才能完成此操作?任何帮助是极大的赞赏。谢谢!

正常状态:

高亮状态

按下并移动触摸后(我想避免的):

 - (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    UIImageView *accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"accessoryDark.png"]];
    cell.accessoryView = accessoryView;


- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    UIImageView *accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"accessory.png"]];
    cell.accessoryView = accessoryView;

【问题讨论】:

【参考方案1】:

我尝试复制您的设置,我发现传递给 didUnhighlightRowAtIndexPath 的 indexPath 包含一个 NSNotFound 行。因此,您可能想检查您在didUnhighlightRowAtIndexPath 中获得的单元格是否非零。如果事实证明您将错误的 indexPaths 传递给 didUnhighlightRowAtIndexPath,那么我认为我们可以将其归结为新 API 中的一个错误,您将要使用 didSelectRow 和 didDeselectRow,或者子类 UITableViewCell 并注意更改到您的子类中选定和突出显示的状态。

您可以尝试的另一件事是将附件视图设置为

[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"accessory"] highlightedImage:[UIImage imageNamed:@"accessoryDark"]];

然后(理论上)附件视图将根据单元格的突出显示状态自动显示正确的突出显示或未突出显示的图像,并且您不必在委托方法中观察这些更新。

【讨论】:

谢谢!我最终使用了UIImageViewhighlightedImage 设置。您对didUnhighlightRowAtIndexPath 中的 indexPath 也是正确的,但我最终没有使用它,因为 UIImageView 是更简单的解决方案。【参考方案2】:

尝试使用didSelectRow...didDeselectRow...。您还应该保留对所选单元格的索引路径的引用。这样滚动就不会弄乱您的单元格(当然,在cellForRow... 中,您检查当前单元格是否是选定的单元格,并相应地设置附件视图)。希望这会有所帮助!

【讨论】:

滚动并不是真正搞砸的东西。这是在选择单元格之前取消突出显示的事实。所以 didSelectRow...didUnhighlight...didDeselectRow... 甚至都没有被调用。

以上是关于在 UITableViewCell 的突出显示上更改附件视图的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用 UITableViewCell 突出显示?

突出显示的 UITableViewCell 和选定的 UITableViewCell 有啥区别?

在 Swift 中以编程方式突出显示 UITableViewCell

在 Swift 中设置动画 UITableViewCell 突出显示颜色

在复合 UIView 中的触摸事件上突出显示 UITableViewCell

UITableViewCell 保持突出显示是不是违反 HIG?