4

当用户键入一些文本时,我正在观察 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 事件。有什么办法吗?

例如,感谢这篇文章,我知道使用 UITextField 可以使用 UITextField.sendActions(for: .ValueChanged) 函数。UISearchBar 有类似的方法吗?

4

3 回答 3

5

您可以将 aVariable<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)
    }
}
于 2017-11-20T00:40:10.293 回答
1

是的,同样适用于UITextBar.

.text以编程方式设置不会自动触发动作,我不知道为什么!但这也是UITextField如此。

sendActions每次更新子类.text的属性后调用UIView

尝试这个 :

// Programmatically trigger a search
    mySearchBar.text = "Some text to search"    
    mySearchBar.sendActions(for: .valueChanged)
于 2019-05-14T14:53:32.963 回答
1

这是Drivers的简单用法

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驱动程序,它可能是您的网络或数据库获取的响应。搜索文本转换为 Driver 然后与dataModels创建matchedCases.

于 2019-05-14T06:18:07.887 回答