使用 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 的原型吗? 如果BookOrderId
是 Int
你不能像这样调用它的方法。如果有的话,它会是这样的: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 - 从自定义单元格和单元格数据传递到另一个控制器