RxSwift 在推送另一个视图后绑定到下一个发送的 textField
RxSwift bind on textField sending next after pushing another view
我在尝试使用 RxSwift 从 ViewA
导航到 ViewB
时遇到了一个奇怪的问题。
我有以下代码(这只是一个例子):
emailTextField.rx.text
.map { [=10=] ?? "" }
.bind(to: viewModel.email)
.disposed(by: bag)
viewModel.email
.asObservable()
.filter { [=10=].isValidEmail }
.subscribe(onNext: { value in
self.performSegue(withIdentifier: viewBSegue, sender: value)
})
.disposed(by: bag)
问题是,在 ViewB
出现后,我的 viewModel
中的 subscribe
再次被调用,导致再次推送 ViewB
。
email
viewModel
中的变量是 PublishSubject<String>
而我正在使用 RxSwift
|RxCocoa 4.1
对我来说,这看起来像是 RxCocoa 中的一个错误,但也许我没有看到什么。 text
可观察对象(它是一个 controlPropertyWithDefaultEvents
函数)在 每个 编辑事件(包括 editingDidEnd
)上发出。我原以为它只会在 editingChanged
或 valueChanged
事件上发出。
也就是说,您可以只使用 .distinctUntilChanged()
运算符来删除重复的发射。
在用户输入有效电子邮件后,您会立即显示不同的 VC,这似乎有点奇怪。请注意,例如 "foo@bar.co" 是一个有效的电子邮件,但如果我的电子邮件是 "foo@bar.com",我将无法在新的 VC 出现之前输入全部内容。
其他一些评论:
在你有 .map { [=16=] ?? "" }
的地方,有一个 .orEmpty
运算符可以做同样的事情。
您在订阅中捕捉到了强大的自我,这意味着您的 VC 将永远无法从 RAM 中删除。除非你的VC是第一个。
你的 perform segue 中的 sender
不应该是用户的电子邮件。它应该是发送消息的对象,在这种情况下换句话说 self
。
您可以添加 .distinctUntilChanged()
以便过滤任何没有更改的事件。
我在尝试使用 RxSwift 从 ViewA
导航到 ViewB
时遇到了一个奇怪的问题。
我有以下代码(这只是一个例子):
emailTextField.rx.text
.map { [=10=] ?? "" }
.bind(to: viewModel.email)
.disposed(by: bag)
viewModel.email
.asObservable()
.filter { [=10=].isValidEmail }
.subscribe(onNext: { value in
self.performSegue(withIdentifier: viewBSegue, sender: value)
})
.disposed(by: bag)
问题是,在 ViewB
出现后,我的 viewModel
中的 subscribe
再次被调用,导致再次推送 ViewB
。
email
viewModel
中的变量是 PublishSubject<String>
而我正在使用 RxSwift
|RxCocoa 4.1
对我来说,这看起来像是 RxCocoa 中的一个错误,但也许我没有看到什么。 text
可观察对象(它是一个 controlPropertyWithDefaultEvents
函数)在 每个 编辑事件(包括 editingDidEnd
)上发出。我原以为它只会在 editingChanged
或 valueChanged
事件上发出。
也就是说,您可以只使用 .distinctUntilChanged()
运算符来删除重复的发射。
在用户输入有效电子邮件后,您会立即显示不同的 VC,这似乎有点奇怪。请注意,例如 "foo@bar.co" 是一个有效的电子邮件,但如果我的电子邮件是 "foo@bar.com",我将无法在新的 VC 出现之前输入全部内容。
其他一些评论:
在你有 .map { [=16=] ?? "" }
的地方,有一个 .orEmpty
运算符可以做同样的事情。
您在订阅中捕捉到了强大的自我,这意味着您的 VC 将永远无法从 RAM 中删除。除非你的VC是第一个。
你的 perform segue 中的 sender
不应该是用户的电子邮件。它应该是发送消息的对象,在这种情况下换句话说 self
。
您可以添加 .distinctUntilChanged()
以便过滤任何没有更改的事件。