当我在用户选择 UITableView 行后推送 View 时,该行会以蓝色突出显示,然后出现新 View 。没关系。但是当我“返回”时,该行仍以蓝色突出显示。这是我的 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;
}
我究竟做错了什么?
最佳答案
正如上面的答案所指出的,您需要明确取消选择该行。关于如何执行此操作,您有两种选择。第一个,是在选择后立即取消选择行:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
...
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
这将工作得很好,但有一个替代方案,它的方法
UITableViewController
是保持选中的行,然后在 View 重新出现时取消选择它(在您推送的 Controller 从堆栈中弹出之后) .这有一个轻微的优势,即用户在返回时可以看到他们先前选择的一瞥,因此他们可以看到他们先前选择的内容。
要实现这一点,您只需要覆盖
viewWillAppear
:- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
}
正如我所说,这是
UITableViewController
的 viewWillAppear:
的默认实现,如果您使用的是 UITableViewController
并且没有看到这种行为,您应该检查您是否正在调用 0x2513141 中的 0x2413141 类实现,您的 0x251314113131313134131341313134131341313413134113418更新(2013 年 10 月 30 日):嗯,这是一个受欢迎的答案!正如 Ben 在评论中正确指出的那样, UITableViewController 实际上在
super
而不是 viewDidAppear:
中执行此操作 - 这是正确的时机。此外,您可以使用 UITableViewController 的 viewWillAppear:
属性打开和关闭此行为。我已经修改了上面的答案以反射(reflect)这一点。关于iphone - 选定的 UItableViewCell 被选中时保持蓝色,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2803061/