如何使用搜索栏搜索多个视图? (iOS 斯威夫特)
Posted
技术标签:
【中文标题】如何使用搜索栏搜索多个视图? (iOS 斯威夫特)【英文标题】:How to use the Search Bar to search through Multiple Views? (iOS Swift) 【发布时间】:2017-03-21 20:17:42 【问题描述】:ios、斯威夫特
应用现在做什么:
此应用的主视图包含类别(排列在表格视图中),当单击这些类别时,应用会将用户带到包含基本文本和图像的滚动视图。主视图还包含一个搜索栏。用户可以输入类别名称,并过滤结果。
应用需要做什么:
我想改进搜索栏和过滤结果。我希望用户能够过滤类别名称,不仅可以通过输入类别名称,还可以通过输入包含在特定滚动视图中的文本。
例如:类别名称是:“字母”和“数字”。当用户单击“字母”时,他们会被带到一个显示“A B C D .. Z”的视图,当单击“数字”时,他们会被带到显示“1 2 3 4 .. 10”的视图。如果用户在搜索栏中输入“A B”,主视图将过滤以仅显示“字母”类别。如果用户在搜索栏中输入“3”,主视图会过滤以仅显示“数字”类别。
结论:
我对应用程序开发还很陌生,这让我很困惑。任何帮助将不胜感激,无论是代码还是参考。
谢谢。
TableViewController
变量:
@IBOutlet var searchForTool: UISearchBar!
@IBOutlet var toolTable: UITableView!
var searchActive : Bool = false
var filtered : [String] = []
var data = [" Make", " Model"]
var identities = ["A", "B"]
搜索栏过滤器:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
filtered = data.filter( (text: String) -> Bool in
return text.range(of: searchText, options: String.CompareOptions.caseInsensitive) != nil
)
if(filtered.count == 0)
searchActive = false
else
searchActive = true
self.toolTable.reloadData()
显示的单元格:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell
if(searchActive)
cell.toolLabel.text = filtered[indexPath.row]
else
cell.toolLabel.text = data[indexPath.row]
return cell
如果需要,将显示更多代码。
【问题讨论】:
添加代码和屏幕截图会有所帮助 好吧,我从 TableViewController 中添加一些代码 【参考方案1】:这里有一些问题:
您的数据结构如何?作为解决方案,我会选择这样的方法:
class Item
var name: String!
init(name: String)
self.name = name
class Category
var items = [Item]()
var name: String!
init(items: [Item], name: String)
self.items = items
self.name = name
你可以这样使用它:
let letterItems = [Item(name: "A"), Item(name: "B"), Item(name: "C")]
let lettersCategory = Category(items: letterItems, name: "Letters")
let numberItems = [Item(name: "1"), Item(name: "2"), Item(name: "3")]
let numbersCategory = Category(items: numberItems, name: "Numbers")
let cat: [Category] = [lettersCategory, numbersCategory]
您的搜索是如何定义的?
在这里你可以有多种选择:
需要找到搜索文本,因为它写在任何 category.name 或 item.name 中:在这种情况下,在任何 item.name 中都找不到“A B”。如果搜索是“A”->“字母”是匹配的
let searchItem = "A"
let result = cat.filter( $0.name.range(of: searchItem) != nil || $0.items.filter($0.name.range(of: searchItem) != nil ).count > 0)
一个“或”搜索,就像谷歌做的那样:
第一个用“”分隔的搜索字符串 获取每个元素并使用与上述相同的方法 - 展平结果 添加到results
变量
继续下一个单词
【讨论】:
感谢您的回复,也很抱歉没有早点提供我的代码结构(我现在有)。如您所见,我们的结构不同。但我会进一步检查你的代码,它可能会让我更接近解决方案。 你需要链接你的实体:data
和identities
,这样你就可以做一个级联过滤器。
我该怎么做。从我读到的内容来看,这听起来相当复杂。具有双二次滤波器函数、vDSP API 等。以上是关于如何使用搜索栏搜索多个视图? (iOS 斯威夫特)的主要内容,如果未能解决你的问题,请参考以下文章