如果我有一个过滤搜索结果的 UITableView,如何将 ViewDidLoad() 上的 IndexPath 设置为常量,即使在搜索时也是如此

Posted

技术标签:

【中文标题】如果我有一个过滤搜索结果的 UITableView,如何将 ViewDidLoad() 上的 IndexPath 设置为常量,即使在搜索时也是如此【英文标题】:if I have a UITableView that filters results on a search, how do I set the IndexPath on ViewDidLoad() to be constant even when searched 【发布时间】:2019-05-05 01:46:49 【问题描述】:

我正在尝试设置一个可搜索的UITableView。现在,当视图加载时,有 23 个单元格,因此 indexPath 从 0 变为 22,如果您单击第三个单元格,它将返回 2 的 indexPath。但是当我搜索某些内容并单击第三个结果时,它仍然返回 2 的 indexPath。但是,我希望搜索的 indexPath 是它最初加载的内容。

【问题讨论】:

为什么搜索时需要相同的索引路径?您仍然可以访问搜索数组中的数据。 当我点击某个单元格时,我想将屏幕发送到另一个secondViewController。在发送它之前,虽然我设置了一个结构变量searchStruct.buttonTag = indexPath。然后,在这个secondViewController 上,我调用searchStruct.buttonTag 以确定secondViewController 上显示的内容。还有另一种方法可以将searchStruct.buttonTag 的值设置为等于原始索引吗? @rmaddy 你绝对不应该设置另一个视图控制器的按钮标签。只需将数据传递给第二个视图控制器。让那个视图控制器更新它自己的视图。 传递数组元素,而不是数组索引 我想传递数组元素,但我会在UITableViewdidSelectItem() 函数中执行此操作。我想这样做:passingData = theArray[indexPath.row];但是,如果不在上面提供的函数中过滤theArray,我就无法做到这一点。你知道搜索时如何过滤这个数组吗? @Paulw11 【参考方案1】:

我认为您可能希望采取稍微不同的方法。

在您的func tableView(UITableView, cellForRowAt: IndexPath) -> UITableViewCell 实现中,您必须将indexPath 转换为您的23 个数据元素之一。无论您是否按搜索条件进行过滤,这都是正确的。

因此,在您实现func tableView(UITableView, didSelectRowAt: IndexPath) 时,我建议您在此函数中对indexPath 进行完全相同的翻译,以获得正确的数据元素。

由于您正在实现相同的逻辑以使用 IndexPath 来获取数据元素,因此该逻辑可能应该在两个表视图函数可以共享的一个函数中。

添加的代码示例

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let cake = filteredCakes[indexPath.row]
        // bake your cell with your cake here
        // cell.textLabel.text = cake.description // or whatever

        return cell
    

那么,在处理用户的点击时:

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        let cake = filteredCakes[indexPath.row]
        // do whatever actions you want now that the user has tapped
    

【讨论】:

感谢您的解决方案,这是有道理的,但我还是有点困惑。你能看到编辑过的问题,并可能给我一个代码应该是什么样子的例子吗?谢谢,非常感谢您的帮助!

以上是关于如果我有一个过滤搜索结果的 UITableView,如何将 ViewDidLoad() 上的 IndexPath 设置为常量,即使在搜索时也是如此的主要内容,如果未能解决你的问题,请参考以下文章

在搜索期间重新加载 UITableView

NSFetchedResultsController 结果过滤

同时过滤具有2个条件的数组?

如何在 Swift 中使用搜索栏过滤具有自定义单元格的 UITableView 的内容?

SearchBar 过滤和调整 UITableView 单元格?

UIViewController 内带有 UITableView 的搜索栏