実現したいこと
ForEachで生成したButtonごとに、表示させる.sheetの内容を変えたい。
前提
Swift/Xcodeでゲーム開発をしています。
今回は、バトルログ画面でターン配列ごとにそのターンの詳細を見れるようにしたいと思っています。
発生している問題・エラーメッセージ
ForEachで配列の[turns]ごとにButtonが生成されており、.sheet{}内でBattleModalView()を呼び出し、引数に表示したいString(infoText: infoText)を渡しています。BattleModalView()のinfoText:Stringは@Stateで宣言しているため、再描画されるはずだと思ったのですが、いつ生成されたButtonを押しても配列の最初(turns[1])の情報が描画されたBattleModalView()になります。これを、turns[2]で生成したButtonを押したらturns[2].infoText、turns[10]で生成したButtonを押したらturns[10].infoTextの情報がBattleModalView()に表示されるようにしたいです。
該当のソースコード
Swift
1import SwiftUI 2import Liquid 3 4// 省略 5 6struct TurnsView: View { 7 var turns: [Turns] 8 @State private var showingModal = false 9 10 var body:some View { 11 ForEach (0 ..< (turns.count ?? 0)) { index in 12 let i = index 13 14 // 省略 15 Button(action: { 16 self.showingModal.toggle() 17 }) { 18 Text("ターンの詳細を見る") 19 }.sheet(isPresented: $showingModal) { 20 let thisInfo = turns[i].infoText 21 BattleModalView(infoText: thisInfo) 22 } 23 .font(.system(size: 12)) 24 .frame( maxWidth: .infinity, alignment: .leading) 25 .padding(.leading, 57) 26 .foregroundColor(.blue) 27 .fontWeight(.bold) 28 29// 省略 30 } 31 } 32 } 33} 34 35// 省略 36 37struct BattleModalView: View { 38 @State var infoText: String 39 var body: some View { 40 41 ScrollView { 42 43 Text(infoText) 44 .font(.system(size: 8)) 45 .foregroundColor(.black) 46 .fontWeight(.bold) 47 .padding() 48 49 } 50 .frame(maxWidth: .infinity, maxHeight: .infinity) 51 52 } 53}
試したこと
検索、chatGPTへの質問など色々調べましたが、全く同じケースが出てきませんでした。。
補足情報(FW/ツールのバージョンなど)
Version 14.2

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。