15

私は SwiftUI と Combine をいじってみましたが、おそらくビュー内の既存の @State プロパティを取得して新しいものを作成する方法があると感じています。

たとえば、ユーザーのパスワードと passwordConfirm フィールドを保持するパスワード作成ビューがあります。これら 2 つの @State プロパティを使用して、入力が有効かどうかをアサートするビューで使用できる新しい @State を派生させたいと考えています。簡単にするために、空でもなく、等しいわけでもありません。

Apple のドキュメントによると、バインディングには発行者がいるとのことですが、私はそれを把握できていないようです。

これは、機能しない疑似コードです。

import SwiftUI
import Combine

struct CreatePasswordView : View {
    @State var password = ""
    @State var confirmation = ""
    lazy var valid = {
        return self.$password.publisher()
            .combineLatest(self.$confirmation)
            .map { $0 != "" && $0 == $1 }
    }

    var body: some View {
        SecureField($password, placeholder: Text("password"))

        SecureField($confirmation, placeholder: Text("confirm password"))

        NavigationButton(destination: NextView()) { Text("Done") }
            .disabled(!valid)
    }
}

誰でも見つけた。これについての適切な方法/可能であれば?

更新ベータ 2:

ベータ 2 の時点でパブリッシャーが利用できるようになったため、このコードの前半が機能するようになりました。結果のパブリッシャーをビュー内で使用する後半は、まだわかりません ( disabled(!valid))。

import SwiftUI
import Combine

struct CreatePasswordView : View {
    @State var password = ""
    @State var confirmation = ""

    lazy var valid = {
        Publishers.CombineLatest(
            password.publisher(),
            confirmation.publisher(),
            transform: { String($0) != "" && $0 == $1 }
        )
    }()

    var body: some View {
        SecureField($password, placeholder: Text("password"))

        SecureField($confirmation, placeholder: Text("confirm password"))

        NavigationButton(destination: NextView()) { Text("Done") }
            .disabled(!valid)
    }
}

ありがとう。

4

2 に答える 2