我将表视图与两个不同的数据源绑定,例如一个具有实际结果,另一个具有点击范围按钮过滤器的数组。
func bind() {
self.searchBar.rx.searchButtonClicked
.throttle(0.3, scheduler: MainScheduler.instance)
.flatMapLatest { [weak self] _ -> Observable<[String]> in
guard let `self` = self else { return .just([]) }
guard let query = self.searchBar.text else { return .just([]) }
self.view.endEditing(true)
self.loadingText.isHidden = false
let items = self.githubService.search(query: query)
self.githubService.searchItems = items
return items
}
.bind(to: self.tableView.rx.items(cellIdentifier: "cell")) { row, name, cell in
self.loadingText.isHidden = true
cell.textLabel?.text = name
}
.disposed(by: self.disposeBag)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.tableView.frame = self.view.bounds
}
}
func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
//filterContentForSearchText(searchBar.text!, scope: searchBar.scopeButtonTitles![selectedScope])
let filteredResult = self.githubService.filteredSearch(index: selectedScope)
filteredResult
.bind(to: self.tableView.rx.items(cellIdentifier: "cell")) { row, name, cell in // Getting crash here
self.loadingText.isHidden = true
cell.textLabel?.text = name
}
.disposed(by: self.disposeBag)
}
这是我用来过滤的方法。
func filteredSearch(index:Int) -> Observable<[String]> {
guard index > 0 else { return .just([]) }
return searchItems!.filter { $0.contains("a")}
}
错误非常明显,不能有两个不同的数据源。相反,您可以在两组数据之间更改datSource的内容。
我建议你使用RxDataSources