UITextField自动填充后选「自定义密码」无法绑定值的问题
解决密码输入框自动填充「自定义密码」时RxSwift监听失效问题
问题场景
我给密码UITextField编写了如下RxSwift逻辑:
mainView.passwordTextField.rx.text.orEmpty.bind(to: viewModel.password).disposed(by: disposeBag) mainView.passwordTextField.rx.controlEvent([.editingChanged]) .asObservable() .subscribe { [mainView, viewModel, weak self] _ in print(">>>>>>") print(viewModel.password.value) self?.updateView() }.disposed(by: disposeBag)
自动填充密码时控制台能正常输出内容,但选择自动密码建议里的「My own password(自定义密码)」时,输入框被清空,可上述监听事件未触发,viewModel.password.value仍保留之前的非空值。
解决思路与代码
问题根源在于iOS系统修改输入框内容时,未必会触发editingChanged这个UIControl事件。我们可以换个逻辑,直接监听文本本身的变化,而非依赖控件事件:
方案一:监听输入框文本变化
替换原来的controlEvent(.editingChanged)订阅,改为监听输入框的文本变动,这样无论文本是用户输入、系统填充还是清空,都能触发回调:
// 保留输入框与viewModel的绑定逻辑 mainView.passwordTextField.rx.text.orEmpty.bind(to: viewModel.password).disposed(by: disposeBag) // 替换控件事件监听为文本变化监听 mainView.passwordTextField.rx.text.orEmpty .subscribe(onNext: { [weak self, viewModel] _ in print(">>>>>>") print(viewModel.password.value) self?.updateView() }) .disposed(by: disposeBag)
方案二:直接监听ViewModel的密码属性(更贴合MVVM)
既然输入框已经和viewModel.password做了绑定,我们可以直接监听这个属性的变化,这样只要密码值更新,不管来源是什么,都能触发updateView():
// 输入框与viewModel的绑定逻辑不变 mainView.passwordTextField.rx.text.orEmpty.bind(to: viewModel.password).disposed(by: disposeBag) // 监听viewModel中password的变化 viewModel.password .subscribe(onNext: { [weak self] password in print(">>>>>>") print(password) self?.updateView() }) .disposed(by: disposeBag)
这两种方案都能覆盖系统自动清空输入框的场景,保证updateView()能被正确触发。
内容的提问来源于stack exchange,提问作者kunass2
相关产品推荐
相关产品推荐

