RxSwift格式文本

时间:2018-01-10 06:27:46

标签: ios swift mvvm rx-swift

我是RxSwift的新手,但我正在尝试使用RxSwift和MVVM模式格式化一些文本。 我有一个文本字段,我希望用户在他们的信用卡号中写,并且在他们写的时候我想格式化它。

所以当他们写“6789430078303201”时,我想将其格式化为: “6789 4300 7830 3201”

有关如何执行此操作的任何建议吗?

Aleksander Aleksic

3 个答案:

答案 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)
    }
}