表视图单元格突出显示无关紧要

时间:2016-10-08 05:36:01

标签: swift uitableview uistoryboardsegue

当用户点击其中一个表格视图单元格时,我的基于故事板的UITableViewController子类会将另一个视图控制器推送到导航中。

我使用 segue 来完成此操作,而使用pushViewController(:animated:)以编程方式执行此操作。

问题我的问题是我的表格视图单元格一直保持高亮显示(浅灰色),即使在弹出视图控制器之后(再次,'放松&# 39; segue)。清除它的唯一方法是致电tableView.reloadData()

我试过了:

  1. 环境:

    self.clearsSelectionOnViewWillAppear = true
    
    viewDidLoad()中的

    (不一定是必要的,因为它已经是默认值:模板代码已注释掉self.clearsSelectionOnViewWillAppear = false,并建议取消注释以覆盖默认功能。)< / p>

  2. 此外:

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    
        if let indexPath = tableView.indexPathForSelectedRow {
            tableView.deselectRow(at: indexPath, animated: true)
        }
    }
    

    ......无济于事。

    编辑:只有在添加到视图层次结构(例如viewDidAppear())后,才会在导航弹出窗口中调用 。将此代码放在addSubview() 可以解决问题。但是我在这篇文章末尾的问题仍然存在。

  3. 我也试过实现这个方法:

    viewWillAppear()

    ...但它没有被调用(可能是因为segue?)

  4. 成功取消单元格的唯一方法就是调用:

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

    ...来自tableView.deselectRow(at: indexPath, animated: true) 。但这发生在 push 上,我想在 pop 上取消突出显示我的单元格。

    我是否需要为push(cell tap)segue设置专用的展开方法,并在那里取消强光?

    为什么它没有开箱即用,即使我是prepareForSegue()的子类?

2 个答案:

答案 0 :(得分:6)

就像你提到的那样,使用tableView.deselectRow(at: indexPath, animated: true)

但是,不要将其放入:

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

你应该把它放进去:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // You other cell selected functions here ...
    // then add the below at the end of it.
    tableView.deselectRow(at: indexPath, animated: true)
}
在取消选择某行之前,不会调用

didDeselectRowAt。因此,为了取消选择单元格,您应该在didSelectRow中添加它。这样,无论何时选择单元格并didSelectRow获得触发器,您都将运行其他代码,并在其末尾运行de-select单元格。

答案 1 :(得分:1)

第三个选项应该有用,我想你只是意外地使用didDeselectRow自动完成,而不是didSelectRow。