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

问题描述:

我已经被这个难住了一段时间...弹出详细视图后自动取消表格视图单元格?

当您点击在苹果的iPhone手机应用程序中的联系人的细胞(进入接触的细节视图),然后点击回到以前的观点,有一个简短的动画(从蓝色渐变为白色)显示取消选择该单元格。这是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];。)

也有人建议在一个问题具有[[self tableView] reloadData];-viewWillAppear:可能会导致不保持选定细胞的评论。但CoreDataBooks做同样的事情,仍然有没有任何特定的代码所需的行为(看似)。

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

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

+0

为了防万一,我使用Xcode 4.2和iPhone 5.0模拟器。我的项目使用ARC。 – James 2012-01-11 17:26:24

+0

从viewWillAppear调用deselction方法时,您是否调试过indexpath的值?当时是什么? – rishi 2012-01-11 17:40:53

+1

不知道我是否正确做到了这一点,但我试着记录'indexPathForSelectedRow'的返回值,并且段和行都是“(null)”。 – James 2012-01-11 18:00:06

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

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

//编辑// 正如以下评论所述,我们最终做的是将电话转到[[self tableview] reloadData];viewDidAppear
我的猜测是,CoreDataBooks有足够复杂的表格(包括章节和书籍以及章节和书籍),表明事件的时间正在发生变化。

+0

最初,在'-viewWillAppear:'我只有'[super viewWillAppear:animated];'''[self tableView] reloadData;''。我玩过添加'[self setClearsSelectionOnViewWillAppear:NO];'并删除'[[self tableView] reloadData];'。似乎问题是'reloadData'在显示表视图之前清除单元格选择。当我删除它时,单元格取消选择似乎表现得很好,但是我需要'reloadData',以便显示新添加的单元格(在解除添加它们的模式视图控制器时)。 – James 2012-01-12 02:08:04

+0

将'clearsSelectionOnViewWillAppear'设置为'NO'时,只有当'reloadData'也被删除时(以前选择的单元格,可预测地停留在高亮显示的状态下)才会产生明显差异,因此与当前问题无关。 – James 2012-01-12 02:15:47

+0

这将是非常hacky,但你可以延迟调用'reloadData'。像'[[self tableView] performSelector:@selector(reloadData)withObject:nil afterDelay:0.2];''。我不知道它是否会起作用。 – Walter 2012-01-12 10:28:03

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

+0

请阅读问题和评论。你提出的答案已经成为问题的一部分。感谢您试图帮助。 – James 2012-01-12 16:31:56

+0

我之所以这样回答,是因为如果将'tableView'更改为'self.tableView',它有时会起作用。 – Souljacker 2012-01-12 16:58:22

+0

我已经试过了,但是谢谢。 – James 2012-01-13 08:32:08