在 UITextField RxSwift 上调用 editorDidEnd 时出现重复事件
Posted
技术标签:
【中文标题】在 UITextField RxSwift 上调用 editorDidEnd 时出现重复事件【英文标题】:Duplicate event when editingDidEnd called on UITextField RxSwift 【发布时间】:2018-02-21 14:28:10 【问题描述】:我有一个用于捕获用户登录名的文本字段。
-
用户在文本字段内部点击。文本字段发出一个空字符串事件。
然后用户点击一些文本(“123”)。文本字段为每个字符发出一个事件。
然后用户点击另一个文本字段的内部。文本字段发出一个表示文本字段最新状态(“123”)的事件。
我想知道为什么文本字段会发出最后一个事件,有没有办法抑制最后一个事件。我尝试添加 distinctUntilChanged
但这没有效果。我认为distinctUntilChanged
不会触发最后一个事件,因为它与上一个事件相同。
let userNameStream: Observable<String> = userNameText
.rx
.text
.orEmpty
.skip(1)
.debug("userNameStream")
.asObservable()
.share(replay:1)
.distinctUntilChanged()
输出
018-02-21 06:05:29.303: userNameStream -> Event next()
userNameText : editingDidBegin
2018-02-21 06:05:38.448: userNameStream -> Event next(1)
2018-02-21 06:05:43.369: userNameStream -> Event next(12)
2018-02-21 06:05:48.880: userNameStream -> Event next(123)
2018-02-21 06:06:03.224: userNameStream -> Event next(123) // Duplicate Event!
userNameText : editingDidEnd
【问题讨论】:
【参考方案1】:将debug
运算符移到distinctUntilChanged
运算符之后
let userNameStream: Observable<String> = userNameText
.rx
.text
.orEmpty
.skip(1)
.distinctUntilChanged()
.debug("userNameStream")
.asObservable()
.share(replay:1)
【讨论】:
【参考方案2】:我正在使用:RxCocoa (4.1.2)、RxSwift (4.1.2)
请尝试以下代码:
let disposeBag = DisposeBag()
userNameText
.rx
.text
.orEmpty
.distinctUntilChanged()
.debug()
.subscribe()
.disposed(by: disposeBag)
日志
2018-02-22 11:47:21.618: ViewController.swift:26 (viewDidLoad()) -> subscribed
2018-02-22 11:47:21.620: ViewController.swift:26 (viewDidLoad()) -> Event next()
2018-02-22 11:47:29.560: ViewController.swift:26 (viewDidLoad()) -> Event next(a)
2018-02-22 11:47:30.046: ViewController.swift:26 (viewDidLoad()) -> Event next(ab)
2018-02-22 11:47:30.464: ViewController.swift:26 (viewDidLoad()) -> Event next(abc)
如果您有问题,请发布您的库版本,以便我提供帮助。
【讨论】:
以上是关于在 UITextField RxSwift 上调用 editorDidEnd 时出现重复事件的主要内容,如果未能解决你的问题,请参考以下文章
UITextField 使用 RxSwift 绑定到 ViewModel
RxSwift - 当 UITextField 以编程方式更新时,UILabel 字段未更新
如何使用 RxSwift 观察 UITextField 中的文本变化?
根据 UITextField 中的值禁用按钮只能工作一次(RxSwift)