如何使用搜索栏搜索多个视图? (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 变量 继续下一个单词

【讨论】:

感谢您的回复,也很抱歉没有早点提供我的代码结构(我现在有)。如您所见,我们的结构不同。但我会进一步检查你的代码,它可能会让我更接近解决方案。 你需要链接你的实体:dataidentities,这样你就可以做一个级联过滤器。 我该怎么做。从我读到的内容来看,这听起来相当复杂。具有双二次滤波器函数、vDSP API 等。

以上是关于如何使用搜索栏搜索多个视图? (iOS 斯威夫特)的主要内容,如果未能解决你的问题,请参考以下文章

SearchBar 如何通过 NSMutableArray 进行搜索?

嵌套视图中的搜索栏和搜索栏控制器 (iOS)

如何将搜索栏添加到集合视图控制器?

如何在 iOS 中禁用导航栏

导航栏中的 iOS 搜索栏

IOS swift如何让我的子视图出现在我的搜索栏下方