【发布时间】:2019-07-31 08:49:24
【问题描述】:
我从 RxSwift 开始,并试图获得一个使用 UISearchController 过滤数据源的简单示例。
我将 UISearchController 的基本设置连接到 UITableViewController。使用 MVVM,我还有一个基本的视图模型设置来驱动表格。
self.viewModel.searchText.accept(searchController.searchBar.text ?? "")
viewModel.listItems.bind(to: tableView.rx.items(cellIdentifier: "ItemCell")) { row, item, cell in
cell.textLabel!.text = item.name
}
.disposed(by: disposeBag)
查看模型
class ListViewModel {
private let sourceItems: BehaviorRelay<[ListItem]> = BehaviorRelay(value: [
ListItem(name: "abc"),
ListItem(name: "def"),
ListItem(name: "ghi"),
ListItem(name: "jkl"),
ListItem(name: "mno")
])
let searchText = BehaviorRelay<String>(value: "")
var listItems: Observable<[ListItem]> = Observable.just([])
init() {
listItems = sourceItems.asObservable()
}
}
我可以添加搜索过滤,这样只有匹配过滤字符串的值才会显示
let searchObservable = searchText
.throttle(.milliseconds(300), scheduler: MainScheduler.instance)
.distinctUntilChanged()
.filter { query in
return query.count > 2
}
.share(replay: 1)
listItems = Observable.combineLatest(sourceItems.asObservable(), searchObservable) { items, query in
return items.filter({ item in
item.name.lowercased().contains(query.lowercased())
})
}
但是,在匹配过滤器之前,它不会显示任何值。我要做的是最初显示所有值,然后只显示过滤后的值。当searchText 更改但为空或过滤掉事件时,我不太确定如何填充listItems。
【问题讨论】:
-
你如何改变你的搜索文本?
-
您是否尝试过制作 ReplaySubject 类型的
sourceItems? ReplaySubject.create(bufferSize: 1)