1

2 つの String パブリッシャーと、AnyPublisher を返す 1 つの計算プロパティが必要です。ロジックは非常に単純ですが、初期値を伝播する方法があれば知りたいです。パブリッシャーには初期値があるので、何とかできるはずだと思います。

VC では、ViewModel から (textField から) Publishers に新しい値を割り当てています。

firstTextField.addTarget(self, action: #selector(firstTextFieldDidChange(_:)), for: .editingChanged)
secondTextField.addTarget(self, action: #selector(secondTextFieldDidChange(_:)), for: .editingChanged)

@objc private func firstTextFieldDidChange(_ textField: UITextField) {
 viewModel.firstPublisher = textField.text ?? ""
}
@objc private func secondTextFieldDidChange(_ textField: UITextField) {
 viewModel.secondPublisher = textField.text ?? ""
}

次に、Publisher (combineLatest) をボタンに割り当てます。

_ = viewModel.validatedText
   .receive(on: RunLoop.main)
   .assign(to: \.isEnabled, on: button)

VM には 2 つのパブリッシャーがあります。

@Published var firstPublisher: String = ""
@Published var secondPublisher: String = ""

およびCombineLatest:

var validatedText: AnyPublisher<Bool, Never> {
    return Publishers.CombineLatest($firstPublisher, $secondPublisher) {
        return !($0.isEmpty || $1.isEmpty)
        }.eraseToAnyPublisher()
}

validatedText は、両方のテキスト フィールドに入力を開始したときにのみ、新しい値の公開を開始します。たとえば、VM の初期化で (最初と 2 番目のパブリッシャーに) いくつかの新しい値を割り当てようとしましたが、それも機能しませんでした。それを行う方法はありますか、または結合を使用せずにボタンの初期状態を設定する (無効にする) 必要がありますか?

4

1 に答える 1