RxSwift中如何获取当前触发的controlEvent具体类型
RxSwift监听UITextField多个编辑事件时获取具体事件类型的实现方案
你当前的写法无法直接拿到触发的具体事件类型:
rx.controlEvent方法合并多个UIControl事件监听时,订阅回调输出的是Void空值,不会携带具体触发的事件类型参数,你代码里的event参数本质是空值,并非事件类型枚举值,自然无法做类型判断。- 你原有代码里方法参数标注的
ControlEvent是RxSwift封装的事件流类型,并非UIKit的UIControl事件枚举,正确的事件类型参数应该是UIControl.Event。
可行实现方案
通过merge操作符把两个单独的事件流合并,给每个事件流预先map绑定对应的事件类型,就可以在统一的订阅回调里拿到具体的事件类型,所有差异化逻辑完全可以收敛在同一个处理方法中,这也是RxSwift场景下的标准实现方式,没有额外性能损耗:
import RxSwift import RxCocoa import UIKit // 业务代码中省略其他无关逻辑... // 合并两个编辑事件流,分别标记对应的事件类型 Observable.merge( textField.rx.controlEvent(.editingDidBegin).map { UIControl.Event.editingDidBegin }, textField.rx.controlEvent(.editingDidEnd).map { UIControl.Event.editingDidEnd } ) .subscribe(onNext: { [weak self] triggerType in self?.setFocusing(type: triggerType) }) .disposed(by: disposeBag) // 统一处理逻辑方法 private func setFocusing(type: UIControl.Event) { switch type { case .editingDidBegin: // 写入输入框聚焦、边框高亮等开始编辑逻辑 break case .editingDidEnd: // 写入输入框失焦、内容校验、边框恢复等结束编辑逻辑 break default: break } }
注意:不要为了获取事件类型使用runtime hook、自定义UIControl子类转发事件等冗余方案,上述merge实现逻辑最轻量,和你原本传入事件数组监听的性能表现完全一致。
内容的提问来源于stack exchange,提问作者Avengement
相关产品推荐
相关产品推荐

