【问题标题】: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)
    }
}

【讨论】:

  • 我不知道这会这么简单,哈哈。谢谢,伙计。
【解决方案2】:

对于您想要的,您需要实现 UITextField 委托 https://developer.apple.com/documentation/uikit/uitextfielddelegate/1619599-textfield?language=objc 。这是一个更正确的选择。你当然可以把VM里面的文本格式化,交给textField,但是如果用户想编辑中间的值,光标会出现问题

【讨论】:

    【解决方案3】:

    我想 .window(4) 可以帮助拆分部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2018-03-05
      • 2011-07-13
      • 2011-09-07
      • 2010-11-13
      • 1970-01-01
      相关资源
      最近更新 更多