我正在使用一个名为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
}
}
答案 0 :(得分:1)
filteredSections
是一个字符串数组,您正在尝试分配在Section
s数组上调用的过滤函数的输出,该数组返回Section
s的数组,因此它显然不起作用。
如果您希望在过滤String
数组时返回Section
,则需要合并filter
和map
,这可以通过一个flatMap
。
flatMap中的三元运算符检查与过滤器相同的条件,但如果条件计算结果为true,则返回section.subSec.name
,否则nil
忽略flatMap
,func 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
,则它可以正常工作。