当我在用户选择 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];
}

正如我所说,这是 UITableViewControllerviewWillAppear: 的默认实现,如果您使用的是 UITableViewController 并且没有看到这种行为,您应该检查您是否正在调用 0x2513141 中的 0x2413141 类实现,您的 0x251314113131313134131341313134131341313413134113418

更新(2013 年 10 月 30 日):嗯,这是一个受欢迎的答案!正如 Ben 在评论中正确指出的那样, UITableViewController 实际上在 super 而不是 viewDidAppear: 中执行此操作 - 这是正确的时机。此外,您可以使用 UITableViewController 的 viewWillAppear: 属性打开和关闭此行为。我已经修改了上面的答案以反射(reflect)这一点。

关于iphone - 选定的 UItableViewCell 被选中时保持蓝色,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2803061/

10-15 04:19