前提・実現したいこと
SwiftUIにて、構造体配列を使ってリストを実装しようとしています。また、リストは「.indices」を使用して表示したいです。
「.indices」を採用する理由としては、今後テキストデータをバインディングさせたい為です。
以下のコードで想定している動作の流れとしては、【ボタンを押下】→【配列に構造体要素を追加】→【リストで全要素を表示】を目指しております。
該当のソースコード
#構造体作成。 struct SampleModel: Identifiable { var id = UUID() var value :String var text: String init(value:String, text: String){ self.value = value self.text = text } } #ObservableObjectで配列を用意。 class Data: ObservableObject { @Published var array: [SampleModel] init(){ self.array = [SampleModel(value: "356", text: "")] #テスト用初期要素 } } #以下、Viewを作成。 struct ContentView: View { @ObservedObject var data: Data = Data() var body: some View { VStack{ #ボタンを用意。押下時に要素を追加。 Button(action: { data.array.append(SampleModel(value: "1234", text: "")) debugPrint("追加") }, label: { Text("Button") }) #テスト用リスト #この方式の場合、ボタン押下と同時にリストのレコードが追加される。 #この場合データバインディングの実装が難しい? List { ForEach(self.data.array) { sample in Text(sample.value) } } #目指している表示方法 #ボタンを押下してもレコードは追加されない。(初めから入っているテスト用初期要素は表示される。) List { ForEach(self.data.array.indices) { index in Text(data.array[index].value) } } } } }
試したこと
どういった原因で追加更新されないのかわからず、手詰まりの状態です。
初歩的な質問で恐縮ですが、ご教授頂きたいです。
補足情報(FW/ツールのバージョンなど)
Xcode 12.5.1
iOS 14.0向け
せっかく SampleModel に id があるのだから、それを使うべきでは。(.indices だと、リストの途中に項目を追加や削除した時に index がずれておかしくなる可能性があります。)
あと、ForEach.init などの .init は省略可能というか、省略するのが一般的です。
このやり方ではidを使えてないから配列の管理が出来ていないという認識でいいでしょうか。自分の中では使っている認識でいました…。もし可能でしたらどのようにすればidを使っている状態になるのかご教授頂けますでしょうか。
.indicesの利用デメリット情報ありがとうございます。データバインディングさせる際、.indicesを使わない手段もあるのでしょうか。知識不足で大変恐縮ですが教えて頂けますと幸いです。
ごめんなさい、データバインディングするには index が必要かもですね。ちょっと考えさせてください。
ちなみに、編集は List 上でそのまま行いますか?  それとも、別画面に遷移して行いますか?
ありがとうございます。
編集はリスト上で行うことを想定しております。よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー