実現したいこと
・単一行が選択可能なListの生成
・Listコンテンツである配列内の値を変数へ代入
前提
Listの単一行選択(タップ)すると、Listコンテンツである、配列の中の値(都道府県名)が変数に代入されるシステムを実現させています。
発生している問題
・Listにおいて、ユーザーによって選択された行に該当する配列のコレクションの値(都道府県名)を変数に代入する方法がわからない状態です。
実現させたい挙動
・変更ボタンタップするとモーダル表示
・キャンセルボタンタップするとモーダル消える *このとき都道府県名が入る変数は”未選択”の状態(初期値)
・モーダルによりList表示の状態で都道府名をタップすると変数初期値が変わり選択された県名が代入される
・件名が代入された状態でキャンセルボタンをタップしても県名はそのまま
該当のソースコード
swiftUI
1import SwiftUI 2 3 4struct PrefecturesData:Identifiable,Hashable { 5 var id = UUID() 6 var name:String 7} 8 9//ForEachに渡すデータコレクション 10var prefectureArray = [ 11 PrefecturesData(name: "北海道"),PrefecturesData(name: "青森県"), 12 PrefecturesData(name: "岩手県"),PrefecturesData(name: "宮城県"), 13 PrefecturesData(name: "秋田県"),PrefecturesData(name: "山形県"), 14 PrefecturesData(name: "福島県"),PrefecturesData(name: "茨城県"), 15 PrefecturesData(name: "栃木県"),PrefecturesData(name: "群馬県"), 16 PrefecturesData(name: "埼玉県"),PrefecturesData(name: "千葉県"), 17 PrefecturesData(name: "東京都"),PrefecturesData(name: "神奈川県"), 18 PrefecturesData(name: "新潟県"),PrefecturesData(name: "富山県"), 19 PrefecturesData(name: "石川県"),PrefecturesData(name: "福井県"), 20 PrefecturesData(name: "山梨県"),PrefecturesData(name: "長野県"), 21 PrefecturesData(name: "岐阜県"),PrefecturesData(name: "静岡県"), 22 PrefecturesData(name: "愛知県"),PrefecturesData(name: "三重県"), 23 PrefecturesData(name: "滋賀県"),PrefecturesData(name: "京都府"), 24 PrefecturesData(name: "大阪府"),PrefecturesData(name: "兵庫県"), 25 PrefecturesData(name: "奈良県"),PrefecturesData(name: "和歌山県"), 26 PrefecturesData(name: "鳥取県"),PrefecturesData(name: "島根県"), 27 PrefecturesData(name: "岡山県"),PrefecturesData(name: "広島県"), 28 PrefecturesData(name: "山口県"),PrefecturesData(name: "徳島県"), 29 PrefecturesData(name: "香川県"),PrefecturesData(name: "愛媛県"), 30 PrefecturesData(name: "高知県"),PrefecturesData(name: "福岡県"), 31 PrefecturesData(name: "佐賀県"),PrefecturesData(name: "長崎県"), 32 PrefecturesData(name: "熊本県"),PrefecturesData(name: "大分県"), 33 PrefecturesData(name: "宮城県"),PrefecturesData(name: "鹿児島県"), 34 PrefecturesData(name: "沖縄県") 35] 36 37 38struct PrefecturesView:View { 39 40 var array:PrefecturesData 41 42 @Binding var isModal:Bool 43 @Binding var prefectures:String 44 45 var body: some View { 46 47 NavigationView { 48 List { 49 //インデックス番号を使いリスト表示 50 ForEach(prefectureArray) { index in 51 Text(index.name) 52 } 53 } 54 55 .onTapGesture { 56 57 58 isModal.toggle() 59 prefectures = array.name 60 61 } 62 .toolbar { 63 ToolbarItem(placement: .navigationBarTrailing) { 64 Button(action: { 65 66 isModal.toggle() 67 68 }, label: { 69 Text("Cansel") 70 }) 71 72 } 73 ToolbarItem(placement: .principal) { 74 Text("都道府県") 75 76 .font(.system(size:18)) 77 } 78 } 79 } 80 } 81} 82 83 84struct ContentView: View { 85 86 @State var prefectures = "未選択" 87 @State var isModal = false 88 89 var body: some View { 90 VStack { 91 HStack { 92 Text("都道府県") 93 94 Spacer() 95 96 Text(prefectures).padding() 97 98 Spacer() 99 100 Button(action: { 101 102 isModal.toggle() 103 104 }, label: { 105 Text("変更") 106 }) 107 .padding() 108 .fullScreenCover(isPresented: $isModal, content: { 109 PrefecturesView(array: prefectureArray[0], isModal: $isModal, prefectures: $prefectures) 110 }) 111 112 113 }.padding() 114 115 Spacer() 116 117 } 118 } 119} 120 121 122 123 124 125 126 127 128 129//prefecturesViewのプレビュー 130struct PrefecturesViewWapper:View { 131 132 @State var isModal = false 133 @State var prefectures = "" 134 135 var body: some View { 136 PrefecturesView(array: prefectureArray[0], isModal: $isModal, prefectures: $prefectures) 137 } 138 139} 140struct ContentView_Previews: PreviewProvider { 141 static var previews: some View { 142 ContentView() 143 PrefecturesViewWapper() 144 } 145} 146
試したこと、わからないこと
・単体選択・編集の記述やリファレンス参考にコードを打ってみた
・配列から要素を参照・取り出す方法の見直し
・タップジェスチャーを使ってみたり、、データの構築の部分での作り込みの部分で影響があるのか、、。
Listにselectionを引数として渡して単体選択を許可する記事やリファレンスを参考したのですが、Listの横に編集マークを出現させて編集する仕様を実現させたいわけではないですし、
ユーザーは何をタップするのかこちらには判断できない状態において、配列から該当する要素が取り出され、値が変数に代入されるようにするには、普通に該当する配列からインデックスを取り出すだけでは実現できないのではないかと考えています。
現状自分には理解が及ばない状態にあります、、、
ご教授のほどよろしくお願いします。
https://capibara1969.com/3478/
https://capibara1969.com/3510/
https://qiita.com/REON/items/1f33886d90b4f758e715
https://tech.amefure.com/swift-struct-index
https://software.small-desk.com/development/2021/08/26/swiftui-howto-utilize-selectionresult/
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

回答1件
あなたの回答
tips
プレビュー