当表重新出现时,UITableView不会自动取消选定的行

正常情况下,当用户从细节视图中popup时, UITableView的选定行将被取消selectanimation。

但是,在我的情况下,我有一个UITableViewembedded到UIViewController我必须在viewWillAppear手动执行它,如下所示:

 -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; // For some reason the tableview does not do it automatically [self.tableView deselectRowAtIndexPath:self.tableView.indexPathForSelectedRow animated:YES]; } 

为什么是这个以及如何解决?

当你的主ViewController是从typesUITableViewController ,它有一个属性 clearsSelectionOnViewWillAppear ,这是默认YES – 所以它会自动清除select。

这个属性不可用于UITableView ,我想这是因为它没有ViewWillAppear方法。

UIViewController不需要这个属性,因为它最初没有UITableView

结论:当你不使用UITableViewController时,你必须自己实现它。

didSelectRowAtIndexPath而不是viewWillAppear取消select:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ //show the second view.. [tableView deselectRowAtIndexPath:indexPath animated:YES]; } 

在swift中,您可以在viewWillAppear添加以下行

 if let row = tableView.indexPathForSelectedRow() { self.tableView.deselectRowAtIndexPath(row, animated: false) } 

在迅速2,它没有派生:

 if let row = tableView.indexPathForSelectedRow { self.tableView.deselectRowAtIndexPath(row, animated: false) } 

我不认为取消选定的行是自动的…我通常在推入下一个视图之前

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ [tableView deselectRowAtIndexPath:indexPath animated:YES]; // to do other things [self.navigationController pushViewController:yourNextViewController animated:YES]; } 

在Swift 3/4

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) } 

没有什么是错的 – 取消选中突出显示的行始终是“手动”。 如果你看看苹果的示例代码,你会看到同样的事情。