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

时间:2010-05-10 13:48:34

标签: 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; 
}

我做错了什么?

7 个答案:

答案 0 :(得分:171)

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

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

这样可以正常工作,但有另一种选择,UITableViewController采用的方法是选择行,然后在视图重新出现时取消选择(在控制器推出之后)从堆栈中弹出。)

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

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

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

正如我所说的,如果你使用UITableViewController看到这种行为,这就是viewWillAppear:的{​​{1}}的默认实现方式。 ,您应检查是否在班级UITableViewController中调用super实施。

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

答案 1 :(得分:11)

UITableViewController有一个名为clearsSelectionOnViewWillAppear的BOOL属性,它完全符合您的要求。

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

解决方案很简单。只需在您的方法版本中的某个地方调用超级版viewWillAppear:

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

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

参考

答案 2 :(得分:7)

您需要取消选择它:

[tableView deselectRowAtIndexPath:indexPath animated:YES];

答案 3 :(得分:4)

如果您的控制器基于UITableViewController,则您可以免费获得此功能。但我经常最终使用UIViewController而没有。除UITableView之外的其他控件,在这种情况下,您应该覆盖viewWillAppear

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

答案 4 :(得分:3)

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

答案 5 :(得分:2)

当用户从详细信息视图返回时,UITableViewController的默认行为会取消选择该行。卢克给出的回答很好,但我想指出原因:

1-如果您的UITableViewController与您从头开始创建它时一样,那么您将拥有所有默认行为。

2-如果在情况1中添加了-viewWillAppear-viewDidAppear,那么您将覆盖标准行为。他们,如果你希望行返回时取消选择,你必须明确表示super你想要它自己取消选择行,就像它一直这样!为实现这一点,正如卢克所说,你必须像这样致电[super viewWillAppear:animated][super viewDidAppear:animated]

-(void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    // Here goes all of your stuff
}

答案 6 :(得分:0)

另一个解决方案是在viewWillAppear

中调用UITableView的reloadData