当用户输入一些文本时,我正在观察UISearchBar.rx.text属性以执行一些与搜索相关的操作。但在某些时候,我也想以编程方式触发此搜索操作。例如,在创建视图时,不幸的是“搜索...”不打印文本。
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
@IBOutlet weak var mySearchBar: UISearchBar!
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
// Trigger search when text changes
mySearchBar.rx.text.subscribe(onNext: { (text)
print("Searching for \(text)...")
// do some search Action
}
.disposed(by: disposeBag)
// Programmatically trigger a search
mySearchBar.text = "Some text to search"
}
}
问题是更改mySearchBar.text不会触发新的rx.text事件。有什么方法可以做到这一点吗?
例如,多亏了this post,我知道使用UITextField,使用UITextField.sendActions( For:.ValueChanged)函数是可能的。对于UISearchBar,有没有类似的方法呢?
发布于 2017-11-20 00:40:10
您可以使用Variable<String?>
作为搜索栏更新的接收器。这样,您还可以通过编程方式设置它的值,并使用变量而不是直接使用搜索栏来驱动您的操作:
class ViewController: UIViewController {
let searchText = Variable<String?>(nil)
let searchBar = UISearchBar()
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
searchBar.rx.text.asDriver()
.drive(searchText)
.disposed(by: disposeBag)
searchText.asObservable().subscribe(onNext: { [weak self] (text) in
if let welf = self, welf.searchBar.text != text {
welf.searchBar.text = text
}
})
.disposed(by: disposeBag)
searchText.value = "variables so cool"
searchText.asObservable().subscribe(onNext: { [weak self] (text) in
self?.doStuff(text)
})
.disposed(by: disposeBag)
}
}
发布于 2019-05-14 06:18:08
这是Driver
的一个简单用法。
import UIKit
import RxCocoa
import RxSwift
class SearchViewController: UIViewController {
@IBOutlet weak var searchBar: UISearchBar!
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
let dataModels = Driver.just(["David", "Behrad","Tony","Carl","Davidov"])
let searchingTextDriver = searchBar.rx.text.orEmpty.asDriver()
let matchedCases = searchingTextDriver.withLatestFrom(dataModels){ searchingItem,models in
return models.filter({ (item) -> Bool in
return item.contains(searchingItem)
})
}
matchedCases.do(onNext: { (items) in
print(items)
}).drive().disposed(by: disposeBag)
}
}
如您所见,我们创建了一个dataModels
驱动程序,它可能是您的网络或dataBase获取的响应。将搜索到的文本转换为Driver,然后与dataModels
混合创建matchedCases
。
发布于 2019-05-14 14:53:33
是的,同样适用于UITextBar
。
以编程方式设置.text
不会自动触发操作,我不知道为什么!但这也是UITextField
的情况。
每次更新UIView
子类的.text
属性后调用sendActions
。
试试这个:
// Programmatically trigger a search
mySearchBar.text = "Some text to search"
mySearchBar.sendActions(for: .valueChanged)
https://stackoverflow.com/questions/47382906
复制相似问题