首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RxSwift -在UISearchBar中以编程方式触发搜索

RxSwift -在UISearchBar中以编程方式触发搜索
EN

Stack Overflow用户
提问于 2017-11-20 06:55:49
回答 3查看 6K关注 0票数 4

当用户输入一些文本时,我正在观察UISearchBar.rx.text属性以执行一些与搜索相关的操作。但在某些时候,我也想以编程方式触发此搜索操作。例如,在创建视图时,不幸的是“搜索...”不打印文本。

代码语言:javascript
运行
复制
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,有没有类似的方法呢?

EN

回答 3

Stack Overflow用户

发布于 2017-11-20 08:40:10

您可以使用Variable<String?>作为搜索栏更新的接收器。这样,您还可以通过编程方式设置它的值,并使用变量而不是直接使用搜索栏来驱动您的操作:

代码语言:javascript
运行
复制
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)
    }
}
票数 5
EN

Stack Overflow用户

发布于 2019-05-14 14:18:08

这是Driver的一个简单用法。

代码语言:javascript
运行
复制
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

票数 1
EN

Stack Overflow用户

发布于 2019-05-14 22:53:33

是的,同样适用于UITextBar

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

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

试试这个:

代码语言:javascript
运行
复制
// Programmatically trigger a search
    mySearchBar.text = "Some text to search"    
    mySearchBar.sendActions(for: .valueChanged)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47382906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档