Iphone 选定的UItableViewCell在选定时保持蓝色
当我在用户选择UITableView行后推送视图时,该行将显示蓝色高亮显示,然后显示新视图。那很好。但当我返回“后退”时,该行仍以蓝色突出显示。这是我的didSelectRowAtIndexPath代码Iphone 选定的UItableViewCell在选定时保持蓝色,iphone,objective-c,uitableview,uinavigationcontroller,Iphone,Objective C,Uitableview,Uinavigationcontroller,当我在用户选择UITableView行后推送视图时,该行将显示蓝色高亮显示,然后显示新视图。那很好。但当我返回“后退”时,该行仍以蓝色突出显示。这是我的didSelectRowAtIndexPath代码 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { SettingsViewController *controller = [[SettingsVie
- (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;
}
我做错了什么?您需要取消选择它:
[tableView取消行索引路径:索引路径:是]代码>您只需要调用[tableView Decelrowatindexpath:indexPath animated:YES]。正如上面的答案所指出的,您需要显式地取消选择该行。你有两个选择如何做到这一点。第一种方法是在选择后立即取消选择行:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
...
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
这将很好地工作,但还有一种替代方法,它是UITableViewController
所采取的方法,即保持选中行,然后在视图重新出现时取消选中它(在您要推的控制器从堆栈中弹出后)
这有一点好处,当用户返回时,可以看到他们以前选择的内容,因此可以看到他们以前选择的内容
要实现这一点,您只需覆盖视图就会出现
:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
}
正如我所说的,这是UITableViewController
的视图的默认实现将出现的情况:
这样做如果您正在使用UITableViewController
并且没有看到这种行为,您应该检查您是否正在类的viewdide:
中调用super
实现
更新(2013年10月30日):这是一个流行的答案!正如Ben在评论中正确指出的那样,UITableViewController实际上是在viewWillDisplay:
而不是viewDidDisplay:
-这是正确的时机。此外,您可以使用UITableViewController的ClearSelectionInviewMillAppear
属性打开和关闭此行为。为了反映这一点,我修改了上面的回答。当用户从详细视图返回时,UITableViewController
的默认行为取消选择行。卢克的回答很好,但我想指出原因:
1-如果您的UITableViewController
与从头创建时一样,您将拥有所有默认行为
2-如果在情况1中添加了-viewwillbeen
或-viewdidebeen
,则将覆盖标准行为。如果您想让行在返回时取消选择,您必须明确地说super
,您希望它像往常一样自己取消选择行!要实现这一点,正如Luke所说,您必须调用[超级视图将显示:动画]
或[超级视图显示:动画]
,如下所示:
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// Here goes all of your stuff
}
另一个解决方案是调用UITableView在视图中的重载数据将出现,如果您的控制器基于UITableViewController
,您可以免费获得此功能。但是我经常使用UIViewController
,除了UITableView
之外,我还使用了很多其他控件,在这种情况下,您应该覆盖视图将显示
-(void) viewWillAppear:(BOOL)animated{
// Unselect the selected row if any
NSIndexPath* selection = [devListTableview indexPathForSelectedRow];
if (selection){
[tableview deselectRowAtIndexPath:selection animated:YES];
}
}
UITableViewController
有一个名为clearselectiononviewwillappear
的BOOL属性,该属性完全满足您的需要
默认情况下,它被设置为YES
,但我注意到,通过实现自己的viewwillbeen:
方法,您可以(有时意外地)禁用此属性。我认为这是因为取消选择发生在[UITableViewController viewwillbeen:][/code>期间,如果覆盖它,可能永远不会调用它
那么,解决办法很简单。只需调用super版本的视图,就会显示:
该方法版本中的某个地方:
- (void)viewWillAppear:(BOOL)animated {
// Your custom code.
[super viewWillAppear:animated];
}
苹果公司建议,如果您覆盖了任何view{Did,Will}{A,Disa}appear方法,则始终调用它们的超级版本
参考资料
真不错。谢谢。@Luke Redpath真棒…谢谢这是一个很好的答案,但我建议将其放置在视图中,以准确模拟UITableViewController取消选择的时间。小心:tableView。indexPathForSelectedRow
是一个可选属性。因此,如果使用viewwillbeen
方法,则需要安全地将其展开,否则一旦视图出现,它就会崩溃。是的,但我认为不在代码中添加重新加载数据的调用被认为是一种好形式。通常有一个更有效的解决方案。