使用 Swift 4 搜索自定义表格单元格和过滤器

Posted

技术标签:

【中文标题】使用 Swift 4 搜索自定义表格单元格和过滤器【英文标题】:Search an Item of Custom UITableCell and Filter using Swift 4 【发布时间】:2018-08-28 08:11:47 【问题描述】:

我正在尝试在我的 UITableViewController 中实现搜索功能。所以我在 UITableView 的单元格顶部添加了一个搜索控制器。

我已经用我的 TableViewController 完成了这个UISearchBarDelegate

这是我过滤搜索文本的代码:

// This method updates filteredData based on the text in the Search Box
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 
    // When there is no text, filteredData is the same as the original data
    // When user has entered text into the search box
    // Use the filter method to iterate over all items in the data array
    // For each item, return true if the item should be included and false if the
    // item should NOT be included
    filteredData = searchText.isEmpty ? OrderDetailsTabBarViewController.orderDetailsList : OrderDetailsTabBarViewController.orderDetailsList.filter  (item: OrderBookedSetterGetter) -> Bool in
        // If dataItem matches the searchText, return true to include it
        return item.BookedOrderId(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil
    

    tableView.reloadData()

但是,它显示错误 Cannot call value of non-function type 'Int' on return item.BookedOrderId(of: searchText, options: .caseInsensitive, range: nil, locale : nil) != nil 行。

BookedOrderId 是一个 Int

谁能帮我解决这个问题。我被困在这里,找不到任何东西。

另外,我遵循了这个教程:

Link Here

谢谢。

【问题讨论】:

你能给我看看 indexpath 的单元格吗 您的意思是 indexPath 处的行单元格? 你能分享一下 BookedOrderId 的原型吗? 如果 BookOrderIdInt 你不能像这样调用它的方法。如果有的话,它会是这样的:item.BookOrderId.methodName(arguments)。您是否已将尝试调用的方法定义为 Int 的扩展? 原型?你是说模型课吗? 【参考方案1】:

这就是我所做的,并且有效!

使用原始数据的副本并在视图控制器上使用它

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 
        // When there is no text, filteredData is the same as the original data
        // When user has entered text into the search box
        // Use the filter method to iterate over all items in the data array
        // For each item, return true if the item should be included and false if the
        // item should NOT be included


            self.searchBar.showsCancelButton = true

            self.copied_order_Canceled_DetailList = []
            for item in self.order_Canceled_DetailList 
            if String(item.orderId).localizedCaseInsensitiveContains(searchText) != false
               self.copied_order_Canceled_DetailList.append(item))
             else 

                
            

            self.tableview.reloadData()
            if searchText == "" 
                self.copied_order_Canceled_DetailList = self.order_Canceled_DetailList
                self.tableview.reloadData()
            
        

这应该可行。

【讨论】:

"if item.BookedOrderId.localizedCaseInsensitiveContains(searchText) != false " 我在这一行中遇到错误,提示“'Int' 类型的值没有成员 'localizedCaseInsensitiveContains” 好的,错误消失了,但列表是一样的。过滤后我应该把这个“self.copied_order_Canceled_DetailList = []”放在哪里..? 无论您想在哪里显示数据,请使用 self.copied_order_Canceled_DetailList 表示对self.copied_order_Canceled_DetailList执行所有操作 好的,感谢您对问题的支持,过滤发生但仅针对确切值。例如,我的值为 345、346、347,如果我输入 3,则不会显示我计数为 3,而不是当我给出完全一样的 345 时它显示 0,然后它显示 1.. 实际上我不应该那样发生。【参考方案2】:

您可能是指range(of...。要使用它,您必须将 Int 转换为 String

filteredData = searchText.isEmpty ? OrderDetailsTabBarViewController.orderDetailsList : OrderDetailsTabBarViewController.orderDetailsList.filter  (item: OrderBookedSetterGetter) -> Bool in
    // If dataItem matches the searchText, return true to include it
    let stringOrderId = String(item.BookedOrderId)
    return stringOrderId.range(of: searchText, options: .caseInsensitive) != nil

【讨论】:

嘿,谢谢,错误消失了,但是,现在没有任何效果。我的意思是当我在模拟器中运行它并在 SearchController 中输入 BookedOrderId 时,什么也没有发生。它不是基于 OrderId 过滤的。 我刚刚回答了这个问题以摆脱错误。我不对你的设计负责?

以上是关于使用 Swift 4 搜索自定义表格单元格和过滤器的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义单元格和多节数组数据的 Swift UITableView

使用 nib 自定义单元格和自动布局滚动跳转(ios 8 swift - UITableview)

Swift - 从自定义单元格和单元格数据传递到另一个控制器

如何在同一个xib中放置自定义单元格和表格视图?

在 calendarTableView 自定义单元格中添加视图破坏了代码 Swift 4

如何区分用户点击我的表格视图单元格和用户点击单元格中包含的子视图?