当我在用户选择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;
}
我做错了什么?
答案 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