Iphone 选定的UItableViewCell在选定时保持蓝色

Iphone 选定的UItableViewCell在选定时保持蓝色,iphone,objective-c,uitableview,uinavigationcontroller,Iphone,Objective C,Uitableview,Uinavigationcontroller,当我在用户选择UITableView行后推送视图时,该行将显示蓝色高亮显示,然后显示新视图。那很好。但当我返回“后退”时,该行仍以蓝色突出显示。这是我的didSelectRowAtIndexPath代码 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { SettingsViewController *controller = [[SettingsVie

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

我做错了什么?

您需要取消选择它:


[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
方法,则需要安全地将其展开,否则一旦视图出现,它就会崩溃。是的,但我认为不在代码中添加重新加载数据的调用被认为是一种好形式。通常有一个更有效的解决方案。