50

通常,当用户从详细视图中弹出时,a 中的选定行UITableView会通过动画取消选择。

但是,在我有一个UITableView嵌入的情况下,我必须像这样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];  
}

为什么会这样以及如何解决?

4

7 回答 7

77

当您的主 ViewController 来自UITableViewController类型时,它具有默认情况下的属性 - 因此它将自动清除选择。clearsSelectionOnViewWillAppearYES

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

UIViewController不需要这个属性,因为它原本UITableView没有。

结论:当你不使用UITableViewController.

于 2012-08-24T09:14:16.653 回答
35

取消选择didSelectRowAtIndexPath而不是viewWillAppear

- (void)tableView:(UITableView *)tableView
                  didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
     //show the second view..
     [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
 }
于 2012-08-24T09:40:06.067 回答
27

在 swift 中,您可以在您的viewWillAppear

if let indexPath = tableView.indexPathForSelectedRow() {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
}

在 swift 2 中,它没有括号:

if let indexPath = tableView.indexPathForSelectedRow {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
}

在 Swift 4(和 3?)中,函数名被清理了:

if let indexPath = tableView.indexPathForSelectedRow {
    tableView.deselectRow(at: indexPath, animated: true)
}
于 2015-06-23T13:28:41.000 回答
4

我不认为取消选择选定的行是自动的......我通常在推送到下一个视图之前这样做

- (void)tableView:(UITableView *)tableView 
        didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    // to do other things
    [self.navigationController pushViewController:yourNextViewController animated:YES];
}
于 2012-08-24T09:02:02.240 回答
1

没有错——取消选择突出显示的行始终是“手动”的。如果您查看 Apple 的示例代码,您会看到相同的内容。

于 2012-08-24T08:52:07.240 回答
1

在斯威夫特 3 / 4

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}
于 2017-09-24T16:59:05.977 回答
1

如果在 的子类中未清除表视图选择UITableViewController,尽管设置为 true,但如果您覆盖该方法clearsSelectionOnViewWillAppear,请确保调用超类版本。[UIViewController viewWillAppear:animated]

如果调用该方法的超级版本失败,则 的值clearsSelectionOnViewWillAppear将不起作用,因为清除表视图选择的工作实际上是在UITableViewController的实现中执行的viewWillAppear

如果您的视图控制器没有从您那里继承,UITableViewController您将需要在viewWillAppear.

于 2020-05-22T12:41:05.903 回答