选中后,选中的UItableViewCell保持蓝色
在用户selectUITableView行后,当我推送视图时,该行将获得蓝色突出显示,然后出现新视图。 没关系。 但是当我“返回”时,行仍然以蓝色突出显示。 这是我的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; }
我究竟做错了什么?
正如上面的答案指出,你需要明确地取消select该行。 你有两个select,你如何做到这一点。 第一,select后立即取消select行:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... [tableView deselectRowAtIndexPath:indexPath animated:YES]; }
这将工作得很好,但有一个替代scheme,它采取的方法是UITableViewController
将离开选定的行,然后取消select当视图重新出现(在你推动的控制器popup堆栈后) 。
这具有稍微的优点,即用户在返回时看到他们先前select的一瞥,以便他们可以看到他们以前select了什么。
要实现这个,你只需要重写viewWillAppear
:
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; }
正如我所说的,这就是UITableViewController
的viewWillAppear:
的默认实现viewWillAppear:
如果你使用的是UITableViewController
并且没有看到这个行为,你应该检查你是否正在调用你自己的类viewDidAppear:
的super
实现。
更新(2013年10月30日) :好吧,这是一个受欢迎的答案! 正如Ben在评论中指出的那样,UITableViewController实际上在viewWillAppear:
做了这个viewWillAppear:
not viewDidAppear:
– 这是正确的时机。 另外,使用UITableViewController的clearsSelectionOnViewWillAppear
属性来打开和closures这个行为。 我已经修改了我的答案,以反映这一点。
UITableViewController
有一个名为clearsSelectionOnViewWillAppear
的BOOL属性,它正是你想要的。
默认情况下它被设置为YES
,但是我注意到你可以(有时意外)通过实现你自己的viewWillAppear:
方法来禁用这个属性。 我认为这是因为取消select发生在[UITableViewController viewWillAppear:]
这可能永远不会被调用,如果你重写它。
那么解决方法很简单。 只要调用超级版本的viewWillAppear:
在你的版本的方法的某个地方:
- (void)viewWillAppear:(BOOL)animated { // Your custom code. [super viewWillAppear:animated]; }
如果您覆盖它们,Applebuild议始终调用任何视图{Did,Will} {A,Disa} ppear方法的超级版本。
参考
- UITableViewController类参考(用于clearsSelectionOnViewWillAppear)
- UIViewController类参考(viewWillAppear 🙂
您需要取消select它:
[tableView deselectRowAtIndexPath:indexPath animated:YES];
如果你的控制器基于UITableViewController
,你可以免费获得这个function。 但是我经常用no的方式来使用UIViewController
。 除了UITableView
之外的其他控件,在这种情况下,你应该覆盖你的viewWillAppear
-(void) viewWillAppear:(BOOL)animated{ // Unselect the selected row if any NSIndexPath* selection = [devListTableview indexPathForSelectedRow]; if (selection){ [tableview deselectRowAtIndexPath:selection animated:YES]; } }
你只需要调用[tableView deselectRowAtIndexPath:indexPath animated:YES]。
UITableViewController
的默认行为取消select用户从详细信息视图返回时的行。 卢克的回应是好的,但我想指出它的原因:
1-如果你有你的UITableViewController
就像你从头开始创build它,你将拥有所有的默认行为。
2-如果在情况1中添加-viewWillAppear
或-viewDidAppear
,则将覆盖标准行为。 他们,如果你想要这个行取消select返回,你必须明确地说, super
,你希望它自己取消行一如既往! 为了达到这个目的,正如Luke所说,你必须像这样调用[super viewWillAppear:animated]
或[super viewDidAppear:animated]
-(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // Here goes all of your stuff }
另一个解决scheme是在viewWillAppear中调用UITableView的reloadData