选中后,选中的UItableViewCell保持蓝色

在用户selectUITableView行后,当我推送视图时,该行将获得蓝色突出显示,然后出现新视图。 没关系。 但是当我“返回”时,行仍然以蓝色突出显示。 这是我的didSelectRowAtIndexPath代码。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { SettingsViewController *controller = [[SettingsViewController alloc] initWithNibName:@"SettingsView" bundle:nil]; [[self navigationController] pushViewController:controller animated:YES]; [controller release], controller = nil; } 

我究竟做错了什么?

正如上面的答案指出,你需要明确地取消select该行。 你有两个select,你如何做到这一点。 第一,select后立即取消select行:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... [tableView deselectRowAtIndexPath:indexPath animated:YES]; } 

这将工作得很好,但有一个替代scheme,它采取的方法是UITableViewController将离开选定的行,然后取消select当视图重新出现(在你推动的控制器popup堆栈后) 。

这具有稍微的优点,即用户在返回时看到他们先前select的一瞥,以便他们可以看到他们以前select了什么。

要实现这个,你只需要重写viewWillAppear

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; } 

正如我所说的,这就是UITableViewControllerviewWillAppear:的默认实现viewWillAppear:如果你使用的是UITableViewController并且没有看到这个行为,你应该检查你是否正在调用你自己的类viewDidAppear:super实现。

更新(2013年10月30日) :好吧,这是一个受欢迎的答案! 正如Ben在评论中指出的那样,UITableViewController实际上在viewWillAppear:做了这个viewWillAppear: not viewDidAppear: – 这是正确的时机。 另外,使用UITableViewController的clearsSelectionOnViewWillAppear属性来打开和closures这个行为。 我已经修改了我的答案,以反映这一点。

UITableViewController有一个名为clearsSelectionOnViewWillAppear的BOOL属性,它正是你想要的。

默认情况下它被设置为YES ,但是我注意到你可以(有时意外)通过实现你自己的viewWillAppear:方法来禁用这个属性。 我认为这是因为取消select发生在[UITableViewController viewWillAppear:]这可能永远不会被调用,如果你重写它。

那么解决方法很简单。 只要调用超级版本的viewWillAppear:在你的版本的方法的某个地方:

 - (void)viewWillAppear:(BOOL)animated { // Your custom code. [super viewWillAppear:animated]; } 

如果您覆盖它们,Applebuild议始终调用任何视图{Did,Will} {A,Disa} ppear方法的超级版本。

参考

  • UITableViewController类参考(用于clearsSelectionOnViewWillAppear)
  • UIViewController类参考(viewWillAppear 🙂

您需要取消select它:

[tableView deselectRowAtIndexPath:indexPath animated:YES];

如果你的控制器基于UITableViewController ,你可以免费获得这个function。 但是我经常用no的方式来使用UIViewController 。 除了UITableView之外的其他控件,在这种情况下,你应该覆盖你的viewWillAppear

 -(void) viewWillAppear:(BOOL)animated{ // Unselect the selected row if any NSIndexPath* selection = [devListTableview indexPathForSelectedRow]; if (selection){ [tableview deselectRowAtIndexPath:selection animated:YES]; } } 

你只需要调用[tableView deselectRowAtIndexPath:indexPath animated:YES]。

UITableViewController的默认行为取消select用户从详细信息视图返回时的行。 卢克的回应是好的,但我想指出它的原因:

1-如果你有你的UITableViewController就像你从头开始创build它,你将拥有所有的默认行为。

2-如果在情况1中添加-viewWillAppear-viewDidAppear ,则将覆盖标准行为。 他们,如果你想要这个行取消select返回,你必须明确地说, super ,你希望它自己取消行一如既往! 为了达到这个目的,正如Luke所说,你必须像这样调用[super viewWillAppear:animated][super viewDidAppear:animated]

 -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // Here goes all of your stuff } 

另一个解决scheme是在viewWillAppear中调用UITableView的reloadData