/ / RxSwift - avvia la ricerca programmaticamente in UISearchBar - ios, swift, rx-swift, rx-cocoa

RxSwift - avvia la ricerca programmaticamente in UISearchBar - ios, swift, rx-swift, rx-cocoa

Sto osservando UISearchBar.rx.attributi di testo per eseguire un'azione correlata alla ricerca quando l'utente digita del testo. Ma a un certo punto, vorrei anche attivare questa azione di ricerca a livello di programmazione. Per esempio alla creazione della vista come in questo esempio, dove sfortunatamente il testo "Ricerca per [...]" non viene stampato.

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

}

Il problema sta cambiando mySearchBar.text non attiva un nuovo evento rx.text. C'è un modo per farlo?

Ad esempio, so grazie questo post con un UITextField, questo è possibile usando la funzione UITextField.sendActions (per: .ValueChanged). C'è un modo simile per farlo con UISearchBar?

risposte:

0 per risposta № 1

Potresti usare a Variable<String?> come un sink per gli aggiornamenti della barra di ricerca. In questo modo puoi anche impostare il suo valore a livello di codice e utilizzare direttamente la variabile anziché la barra di ricerca per guidare la tua azione:

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