2

Apple のセッションとチュートリアルから、BindableObject をビューに渡す 2 つのオプションがあります。

  1. ラッパーを使用BindableObjectして階層の最上位ビューで真のソースとして宣言を使用し、それを宣言された他のビューに渡します。@ObjectBinding@Binding
  2. ラッパーを使用BindableObjectして階層内のトップ ビューで真のソースとして宣言を使用し、モディファイアを使用してトップ ビューを初期化し、それを他のビューまたは宣言済みまたは使用に渡します(この場合、SwiftUI によって自動的に割り当てられ、必要はありません)。 init で渡します)。@EnviromentObject.enviroment(BindableObject)@Binding@EnviromentObjectBindableObject

アイテムのリストがあり、他のビュー(またはRowViewまたは別の画面)のアイテムの1つを変更したい場合は、ユーザー入力の処理チュートリアルから、次のことが必要です。BindableObject

  1. BindableObject上記のいずれかの方法を使用して、 をより深いビューに 渡します。
    1. 選択したアイテムをこのビューに渡します。
    2. BindingViewリスト内のアイテムを見つけて、アイテムのプロパティをバインドしますBindableObject

質問を明確にするためのいくつかのコード:

メッセージモデルとBindableObject

struct Message: Identifiable {
    var id: String
    var toggle: Bool = true
}

class MessageStore: BindableObject {

  let didChange = PassthroughSubject<MessageStore, Never>()

  var messagesList: [Message] = testData {
    didSet {
      didChange.send(self)
    }
  }
}

アイテムのリストを表す MessageView 構造体 MessagesView

 : View {

    @EnvironmentObject var messageStore: MessageStore

    var body: some View {
        NavigationView {
            List(messageStore.messagesList) { message in
                NavigationButton(destination: Text(message.id)) {
                    MessageRow(message: message)
                }
            }
            .navigationBarTitle(Text("Messages"))
        }
    }
}

特定のアイテムの状態を更新するためのトグルを持つ MessageRowBindableObject

struct MessageRow: View {

    @EnvironmentObject var tags: MessageStore
    var message: Message

    var messageIndex: Int {
        tags.messagesList.firstIndex { $0.id == message.id }!
    }


    var body: some View {
       Toggle(isOn: self.$tags.messagesList[self.messageIndex].toggle) {
           Text("Test toogle")
       }
    }

}

このアプローチは、上記のチュートリアルに示されています。

質問:@Binding Message を として個別に渡し、子ビューで直接操作し たかったのですが、これを実装できませんでした。私は少し混乱しました。後でインデックスBindableObjectを使用してアイテムをバインドするために、選択されたアイテムの両方を任意のビュー(バインディングを処理する必要がある)に渡すのは適切な方法ですか? 完全ではなくその一部を渡し、この部分をバインドBindableObjectできるようにする他の方法はありますか(それは真実のソースでなければなりません)、私たちの場合、この部分はですか?BindableObjectMessage

4

1 に答える 1