首页 > 解决方案 > 如何修复:当我在搜索栏中单击“取消”时,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

===========================

但是没有选中行,这是什么问题?

标签: iosswifttableviewsearchbar

解决方案


如果您查看UITableView 文档,它清楚地表明调用 selectRow不会导致委托接收tableView(_:didSelectRowAt:)

您可以将您正在做的任何事情tableView(_:didSelectRowAt:)移到另一个函数中,然后在 and 中调用该tableView(_:didSelectRowAt:)函数searchCancelButtonClicked

或者您可以使用以下代码手动调用tableView(_:didSelectRowAt:)in 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)
}

推荐阅读