2017-11-19 3 views
0

Ich beobachte UISearchBar.rx.text Attribute, um einige Suchaktionen auszuführen, wenn Benutzer Text eingeben. Aber irgendwann möchte ich auch diese Suche Aktion programmgesteuert auslösen. Zum Beispiel bei der Erstellung der Ansicht wie in diesem Beispiel, wo leider der Text "Suche nach [...]" nicht gedruckt wird.RxSwift - programmgesteuerte Suche in UISearchBar

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" 
    } 

} 

Das Problem ändert sich mySearchBar.text löst kein neues rx.text-Ereignis aus. Gibt es einen Weg, dies zu tun?

Zum Beispiel, ich weiß dank this post, dass mit einem UITextField, dies mit der UITextField.sendActions (für: .ValueChanged) -Funktion möglich ist. Gibt es einen ähnlichen Weg mit UISearchBar?

Antwort

0

Sie könnten eine Variable<String?> als eine Senke für Ihre Suchleiste Updates verwenden. Auf diese Weise können Sie den Wert auch programmgesteuert festlegen und die Variable statt der Suchleiste direkt verwenden, um Ihre Aktion zu steuern:

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) 
    } 
} 
+0

Vielen Dank für diesen sympathischen Workaround! – PhilippeC

+0

Kein Problem. Sie sollten auch den Operator '<-> 'von [RxExamples] (https://github.com/ReactiveX/RxSwift/blob/master/RxExample/RxExample/Operators.swift) betrachten. – jefflovejapan