我是RxSwift的新手,但我正在尝试使用RxSwift和MVVM模式格式化一些文本。 我有一个文本字段,我希望用户在他们的信用卡号中写,并且在他们写的时候我想格式化它。
所以当他们写“6789430078303201”时,我想将其格式化为: “6789 4300 7830 3201”
有关如何执行此操作的任何建议吗?
Aleksander Aleksic
答案 0 :(得分:1)
对于您想要的内容,您需要实现UITextField委托https://developer.apple.com/documentation/uikit/uitextfielddelegate/1619599-textfield?language=objc。这是一个更正确的选择。您当然可以在VM内设置文本格式并将其提供给textField,但是如果用户要在中间编辑值,则光标会出现问题
答案 1 :(得分:0)
我认为 .window(4)可以帮助分割部分。
答案 2 :(得分:0)
认为您描述的内容可以通过这种方式解决(不确定代码本身的格式):
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)
}
}