如何解决:当我在搜索栏中单击“取消”时,TableView中的func selectRow不起作用

问题描述

我有一个带音乐播放列表的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)
}