当用户点击其中一个表格视图单元格时,我的基于故事板的UITableViewController
子类会将另一个视图控制器推送到导航中。
我使用 segue 来完成此操作,而不使用pushViewController(:animated:)
以编程方式执行此操作。
问题我的问题是我的表格视图单元格一直保持高亮显示(浅灰色),即使在弹出视图控制器之后(再次,'放松&# 39; segue)。清除它的唯一方法是致电tableView.reloadData()
。
我试过了:
环境:
self.clearsSelectionOnViewWillAppear = true
viewDidLoad()
中的(不一定是必要的,因为它已经是默认值:模板代码已注释掉self.clearsSelectionOnViewWillAppear = false
,并建议取消注释以覆盖默认功能。)< / p>
此外:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if let indexPath = tableView.indexPathForSelectedRow {
tableView.deselectRow(at: indexPath, animated: true)
}
}
......无济于事。
编辑:只有在添加到视图层次结构(例如viewDidAppear()
)后,才会在导航弹出窗口中调用 。将此代码放在addSubview()
中可以解决问题。但是我在这篇文章末尾的问题仍然存在。
我也试过实现这个方法:
viewWillAppear()
...但它没有被调用(可能是因为segue?)
成功取消单元格的唯一方法就是调用:
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()
的子类?
答案 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。