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

can*_*boy 55 iphone objective-c uitableview uinavigationcontroller

当用户选择UITableView行后推送视图时,该行将获得蓝色突出显示,然后出现新视图.没关系.但当我"回"时,行仍然以蓝色突出显示.这是我的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; 
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Luk*_*ath 171

如上面的答案所指出的,您需要明确取消选择该行.关于如何执行此操作,您有两种选择.第一个是在选择后立即取消选择行:

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

这样可以正常工作,但是有一个替代方案,UITableViewController其中所采用的方法是选择行,然后在视图重新出现时取消选择(在您推动的控制器弹出堆栈之后).

这具有一个小优势,即用户在返回时可以看到他们之前选择的一瞥,这样他们就可以看到他们之前选择的内容.

要实现这一点,您只需要覆盖viewWillAppear:

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

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

更新(2013年10月30日):嗯,这是一个受欢迎的答案!作为本正确的评论所指出的,实际上的UITableViewController做到这一点的viewWillAppear:不是viewDidAppear:-这是正确的时机.此外,使用clearsSelectionOnViewWillAppearUITableViewController 的属性打开和关闭此行为.我修改了上面的答案以反映这一点.


Tyl*_*ler 11

UITableViewController有一个BOOL属性调用clearsSelectionOnViewWillAppear,它完全符合你的要求.

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

那么解决方案很简单.只需viewWillAppear:在您的该方法版本中的某处调用super的版本:

- (void)viewWillAppear:(BOOL)animated {
  // Your custom code.
  [super viewWillAppear:animated];
}
Run Code Online (Sandbox Code Playgroud)

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

参考


pka*_*nen 7

你需要取消选择它:

[tableView deselectRowAtIndexPath:indexPath animated:YES];