✅ 結論から
Picker("", selection: $selected_name) は 必ず selection が Picker 内の tag のいずれかにマッチしていないといけません。
もし selected_name が初期値で ""(空文字)で、Picker の中に tag("") が存在しない場合は、選択状態が成立しません。
その結果、何も選ばれていないように見える&変数に値が入らないという挙動になります。
これは 仕様 で、コードのバグではありません 👍。
🛠 対策方法
① 最初からリストの1番目を選択状態にしておく
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
@State var selected_name: String = "" var body: some View { VStack { if SV.favorite_list.isEmpty { Text("お気に入りの場所がありません") } else { Picker("", selection: $selected_name) { ForEach(SV.favorite_list, id: \.self) { favoriteName in Text(String(favoriteName.split(separator: ",")[1])) .tag(favoriteName) } } .pickerStyle(WheelPickerStyle()) Button("OK") { SV.send_name = selected_name self.presentationMode.wrappedValue.dismiss() } } } .onAppear { SV.favorite_list = ["aaa,w", "ss,dd"] // ✅ 初期選択をリストの先頭に設定 if let first = SV.favorite_list.first { selected_name = first } } } |
→ これで、ユーザーが Wheel を操作しなくても 必ず最初の要素が選択される ようになります。
② 「未選択」状態を許容したい場合
もし「必ず選ばせたい」のではなく「未選択状態から始めたい」なら、Optional を使います。
|
1 2 3 4 5 6 7 8 9 |
@State var selected_name: String? = nil Picker("", selection: $selected_name) { ForEach(SV.favorite_list, id: \.self) { favoriteName in Text(String(favoriteName.split(separator: ",")[1])) .tag(Optional(favoriteName)) // ✅ Optionalでtagを付ける } } .pickerStyle(WheelPickerStyle()) |
→ これなら、最初は nil で、ユーザーが操作して初めて selected_name に値が入ります。
💡 まとめ
- 初期値が Picker のタグに含まれていないと、値が入らない → 仕様
- 必ず1つ選ばれた状態にしたいなら 初期値を favorite_list.first に設定
- 「未選択」から始めたいなら Optional の選択肢 を使う

コメント