弹出详细视图后自动取消选择表视图单元格?

Posted

技术标签:

【中文标题】弹出详细视图后自动取消选择表视图单元格?【英文标题】:Automatic deselection of table view cell after popping detail view? 【发布时间】:2012-02-08 01:44:21 【问题描述】:

我已经被这件事难住了一段时间......

当您在 iPhone 的 Apple 电话应用程序中点击联系人的单元格(进入包含联系人详细信息的视图)并点击返回上一个视图时,会有一个简短的动画(从蓝色变为白色)显示取消选择细胞。这是 Apple 自己的应用程序中所有表格视图的行为,也是根据其人机界面指南推荐的行为。

但是,在我自己的项目中,我一直无法复制这种行为。当我从详细视图返回时,我的UITableView 中的任何单元格都没有被选中。

我查看了 Apple 文档中的 CoreDataBooks 示例代码,它具有所需的单元格取消选择行为,并且表格视图似乎“自动”获取该行为(没有任何特定实现)。

我也尝试在这些非常相似的问题中实施解决方案:

What deselect selected cell when navigationController pops a view?

iPhone UITableView cells stay selected

UITableView doesn't keep row selected upon return

但我总是得到相同的结果——当我返回 UITableView 时,没有一个单元格被选中。 (即使在视图控制器的-viewWillAppear: 方法中添加了[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:animated];。)

在一个问题的 cmets 中还建议,在 -viewWillAppear: 中包含 [[self tableView] reloadData]; 可能会导致单元格不保持选中状态。但是 CoreDataBooks 做了同样的事情,并且仍然具有所需的行为(似乎),没有任何特定的代码。

关于如何解决问题的任何建议?提前致谢。

顺便说一句,我不太明白为什么取消选择单元格的代码应该在-viewWillAppear:(而不是-viewDidAppear:)中实现。在表格视图显示在屏幕上之前,这不会导致一切都发生吗?这可能只是由于我对视图的生命周期缺乏正确的理解,但任何澄清都会很好。再次感谢。

【问题讨论】:

以防万一,我使用的是 Xcode 4.2 和 iPhone 5.0 模拟器。我的项目使用 ARC。 从 viewWillAppear 调用 deselction 方法时,您是否调试过 indexpath 的值?当时存在什么? 不确定我是否正确执行此操作,但我尝试记录 indexPathForSelectedRow 的返回值,并且部分和行都是“(null)”。 这是主要问题,您没有保留要选择的单元格索引的值。您还需要存储这些,然后需要调用此方法。 我在电子邮件中提到,这并不是问题的真正答案,而是一种解决方法。实际上,我仍然希望有人能够提供一个真正的答案(例如,为什么 CoreDataBooks 似乎没有具体的实现而一切正常)。 【参考方案1】:

您是否尝试过 UITableViewController(不仅仅是 tableview 而是 tableviewcontroller)的 clearsSelectionOnViewWillAppear 属性?如果您将其设置为NO,它将使选择保持蓝色。 为了获得您想要的效果,您可能还需要添加一个电话到- (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated 以确保它不会永远保持蓝色。

查看UITableView Documentation 的概述部分以开始使用。

//编辑// 正如下面的 cmets 中所指出的,我们最终所做的是将呼叫转移到 [[self tableview] reloadData];viewDidAppear。 我的猜测是,CoreDataBooks 有一个足够复杂的表(包含部分和书籍以及部分和书籍),它会随着事件的发生而发生一些事情。

【讨论】:

原来在-viewWillAppear:中我只有[super viewWillAppear:animated];[[self tableView] reloadData];。我尝试添加[self setClearsSelectionOnViewWillAppear:NO]; 和删除[[self tableView] reloadData];。似乎问题在于reloadData 在显示表格视图之前正在清除单元格选择。当我删除它时,单元格取消选择似乎按预期运行,但是我需要 reloadData 以便显示新添加的单元格(在关闭添加它们的模式视图控制器时)。 clearsSelectionOnViewWillAppear 设置为NO 仅在reloadData 也被删除时才会产生明显的差异(可以预见,先前选择的单元格会卡在突出显示状态),因此与问题无关就在眼前。 这会很麻烦,但您可以延迟拨打reloadData。像[[self tableView] performSelector:@selector(reloadData) withObject:nil afterDelay:0.2]; 这样的东西。我不知道它是否会起作用。 我不想做一些 hacky 的事情,但在这种情况下,我什至认为它不会给我想要的结果。返回视图后,我希望新添加的单元格已经存在,如果可能的话,我还想显示单元格的取消选择动画。至少,我希望在视图之间导航但不添加单元格时显示取消选择动画。让我感到困惑的是,CoreDataBooks 在-viewWillAppear: 中也调用了reloadData,但工作正常。 我今天一直在玩这个。在模拟器中,如果我将reloadData 放在viewDidAppear 中,我可以获得一个股票导航项目,其行为类似于核心数据手册。如果我把它放到viewWillAppear 我可以让它与你所看到的相匹配。所以......我在这一点上的猜测是它在书中起作用的唯一原因是它们有很多部分和很多条目。但这只是猜测。【参考方案2】:

如果要取消选择单元格,请使用 - (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated 并使用 [self.tableView deselectRowAtIndexPath:indexPath animated:YES];[tableView deselectRowAtIndexPath:indexPath animated:YES];

【讨论】:

请阅读问题和cmets。您建议的答案已经是问题的一部分。感谢您尝试提供帮助。 我之所以这样回答,是因为如果您将tableView 更改为self.tableView,它有时会起作用。

以上是关于弹出详细视图后自动取消选择表视图单元格?的主要内容,如果未能解决你的问题,请参考以下文章

如何从表视图控制器转到详细控制器并返回

Swift 2:电子邮件取消按钮在第二次尝试表视图后停止工作

表视图单元格 - UITableView - 无法在详细视图中显示多行

表视图 didSelectRowAtIndexPath,仅在选择第二次单击后才有效

仅当在表格视图中选择单元格时,详细信息披露才会做出反应

为啥当我在目标 c 中重新加载表视图时选择的值会被取消选择