【问题标题】:RxSwift format textRxSwift 格式文本
【发布时间】:2018-01-10 06:27:46
【问题描述】:
我是 RxSwift 的新手,但我正在尝试使用带有 MVVM 模式的 RxSwift 来格式化一些文本。
我有一个文本字段,我希望用户在其中写下他们的信用卡号,并且在他们写的时候我想格式化它。
所以当他们写“6789430078303201”时,我想将其格式化为:
"6789 4300 7830 3201"
关于如何做到这一点的任何建议?
亚历山大·阿列克西奇
【问题讨论】:
标签:
ios
swift
mvvm
rx-swift
【解决方案1】:
认为您所描述的可以这样解决(不确定格式化代码本身):
textField.rx.controlEvent(.editingChanged)
.subscribe(onNext: { [weak self] _ in
guard let self = self, let text = self.textField.text else { return }
let formatedText = text.replacingOccurrences(of: " ", with: "").enumerated().compactMap({ $0 % 4 == 0 ? " \($1)" : "\($1)" }).joined()
self.textField.text = formatedText
})
.disposed(by: disposeBag)
如果你想要 MVVM 来做这件事,也许是这样的:
textField.rx.text
.orEmpty
.distinctUntilChanged()
.bind(to: viewModel.inputText)
.disposed(by: disposeBag)
viewModel.outputText
.bind(to: textField.rx.text)
.disposed(by: disposeBag)
在你的 viewModel 中:
class ViewModel {
var inputText = BehaviorRelay<String>(value: "")
var outputText = BehaviorRelay<String>(value: "")
private let disposeBag = DisposeBag()
init() {
inputText
.subscribe(onNext: { [weak self] (text) in
guard let self = self else { return }
let formatedText = text.replacingOccurrences(of: " ", with: "").enumerated().compactMap({ $0 % 4 == 0 ? " \($1)" : "\($1)" }).joined()
self.outputText.accept(formatedText)
})
.disposed(by: disposeBag)
}
}