UISearchBar不使用数组中的子节

时间:2017-08-26 09:44:12

标签: swift uisearchbar

我正在使用一个名为sections的数组变量,因为表视图具有可折叠的部分:

var sections = [

        // TESTING CODE FOR SECTIONS
        Section(sec: "One",
                subSec: ["A", "B", "C", "D", "E"],
                expanded: false),

        Section(sec: "Two",
                subSec: ["A", "B", "C", "D", "E"],
                expanded: false),

        Section(sec: "Three",
                subSec: ["A", "B", "C", "D", "E"],
                expanded: false),

我正在尝试使用UISearchController使表视图可搜索。这是我到目前为止所尝试的但是它不起作用:

func filterContentForSearchText(_ searchText: String, scope: String = "All") {
  filtered = sections.filter({( section : Section) -> Bool in
    return section.subSec.name.lowercased().contains(searchText.lowercased())
  })

  tableView.reloadData()
}

我理解该函数是如何工作的,但似乎无法让它在变量中使用我的subSec。

//SEARCH
    var filteredSections: [String]?
    let searchController = UISearchController(searchResultsController: nil)


    override func viewDidLoad() {
        super.viewDidLoad()

        //SEARCH
        filteredSections = sections
        searchController.searchResultsUpdater = self
        searchController.hidesNavigationBarDuringPresentation = false
        searchController.dimsBackgroundDuringPresentation = false
        tableView.tableHeaderView = searchController.searchBar

    }

我收到错误,例如'无法指定类型的值'[Section]'来键入'[String]?'我理解为什么,但我不知道如何解决这个问题。

部分定义:

struct Section {
    var sec: String!
    var subSec: [String]! // [ ] = Array of Strings
    var expanded: Bool!

    init(sec: String, subSec: [String], expanded: Bool) {
        self.sec = sec
        self.subSec = subSec
        self.expanded = expanded
    }
}

1 个答案:

答案 0 :(得分:1)

filteredSections是一个字符串数组,您正在尝试分配在Section s数组上调用的过滤函数的输出,该数组返回Section s的数组,因此它显然不起作用。

如果您希望在过滤String数组时返回Section,则需要合并filtermap,这可以通过一个flatMap

flatMap中的三元运算符检查与过滤器相同的条件,但如果条件计算结果为true,则返回section.subSec.name,否则nil忽略flatMapfunc filterContentForSearchText(_ searchText: String, scope: String = "All") { filtered = sections.flatMap{ return $0.subSec.name.lowercased().contains(searchText.lowercased()) ? searchText : nil } tableView.reloadData() } 忽略,因此输出数组只包含匹配的子部分名称。

Section

由于您未在代码中包含subSec.name的定义,因此我无法测试该函数,但如果String--gauge,则它可以正常工作。