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 番目のパブリッシャーに) いくつかの新しい値を割り当てようとしましたが、それも機能しませんでした。それを行う方法はありますか、または結合を使用せずにボタンの初期状態を設定する (無効にする) 必要がありますか?