问题描述
我有一个带音乐播放列表的TableView。当我单击该行时,该曲目开始播放,并选择了当前行。另外,我有一个搜索栏,可以正常工作。但是,如果我单击该行,然后单击搜索栏,然后最后单击“取消”按钮-则不会选择具有当前轨道的行。在其他情况下,例如向前或向后播放,行的选择效果很好。 简化后,我的代码如下:
class TableView: UIViewController,UISearchResaultUpdating,UISearchBarDelegate {
...
private var currentSelectedRowIndex = 0
func ...didSelectRowAt indexPath... {
...
currentSelectedRowIndex = indexPath.row
print(currentSelectedRowIndex)
}
...
func searchCancelButtonClicked... {
print("Cancel button pressed")
print(currentSelectedRowIndex)
tableView.selectRow(at: IndexPath(row: currentSelectedRowIndex,section 0),animated: true,scrollPosition: .middle)
}
}
//例如,我按下了第二行
Console message:
1
Cancel button pressed
1
=========================
但是未选中该行,这是什么问题?
解决方法
如果您查看UITableView
documentation,很明显地说,调用selectRow
不会导致委托收到tableView(_:didSelectRowAt:)
。
您可以将tableView(_:didSelectRowAt:)
中的操作移到另一个函数,然后在tableView(_:didSelectRowAt:)
和searchCancelButtonClicked
中调用该函数。
或者您可以使用以下代码在tableView(_:didSelectRowAt:)
中手动调用searchCancelButtonClicked
。
func searchCancelButtonClicked() {
print("Cancel button pressed")
print(currentSelectedRowIndex)
let indexPath = IndexPath(row: currentSelectedRowIndex,section: 0)
yourTableViewOutlet.delegate?.tableView?(yourTableViewOutlet,didSelectRowAt: indexPath)
tableView.selectRow(at: indexPath,animated: true,scrollPosition: .middle)
}