iOS Swift中如何使用RxSwift订阅UITextView的内容变化事件
问题原因
报错的核心原因是:UITextField 继承自 UIControl,所以支持使用 controlEvent 方法监听交互事件,但 UITextView 是直接继承自 UIScrollView,不属于 UIControl 子类,因此无法复用 UITextField 的写法。
解决方案
RxSwift 已经针对 UITextView 封装了专属的文本变化监听扩展,有两种常用写法可以实现你要的效果:
写法1:直接订阅文本序列(最简便)
textView.rx.text.orEmpty .subscribe(onNext: { text in self.viewModel.address.accept(text) // 其他业务代码 }) .disposed(by: disposeBag)
写法2:对齐原有UITextField的逻辑(先监听编辑事件再取最新文本)
UITextView 有专属的 rx.didChange 事件对应编辑变化场景,替换原来的 controlEvent(.editingChanged) 即可:
textView.rx.didChange .withLatestFrom(textView.rx.text.orEmpty) .subscribe(onNext: { text in self.viewModel.address.accept(text) // 其他业务代码 }) .disposed(by: disposeBag)
注意事项
- 使用前需要确保导入了
RxCocoa库,仅导入RxSwift不会出现UI类的相关rx扩展提示 - 所有订阅需要绑定到
DisposeBag进行内存管理,避免内存泄漏 - 除
didChange外,UITextView还提供了rx.didBeginEditing、rx.didEndEditing等专属扩展,无需手动实现delegate即可监听对应事件
内容的提问来源于stack exchange,提问作者user12401635
相关产品推荐
相关产品推荐

