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)
正如我所说UITableViewController的viewWillAppear:那样,如果你正在使用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方法的超级版本.
参考
| 归档时间: |
|
| 查看次数: |
25730 次 |
| 最近记录: |