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

RxSwift 错误:属性“文本”要求“UITextField”继承自“UILabel”

使用 RxSwift 将多个 UITextField 绑定到类道具