Picker が正しく表示されない
Picker でチェックボックスが表示されないバグはstack overflowでも報告されていて、いろいろ解決法が載っていますが、この方法では解決しません。
バグについて
- 選択しているにも関わらずチェックマークが表示されない
- 選択範囲がおかしい
- Form 内の Picker は全範囲にタップ判定があるのだが、このバグが発生するとラベルにしかタップ判定がない
バグが発生しないコード
以下のコードは普通に動作する。
import SwiftUI
struct ContentView: View { @State var selection: FruitType = .apple private var timers = Array(FruitType.allCases)
var body: some View { NavigationView { Form { Picker(selection: $selection, label: Text("Select")) { ForEach(fruits, id:\.rawValue) { Text($0.rawValue) } } } .navigationTitle("Picker") } }}
enum FruitType: String, CaseIterable { case apple case orange case banana}バグを含むコード
以下のコードは実行すると Picker にバグが発生する。
import SwiftUI
struct ContentView: View { @State var selection: FruitType = .apple private var timers = Array(FruitType.allCases)
var body: some View { NavigationView { Form { Picker(selection: $selection, label: Text("Select")) { ForEach(fruits, id:\.rawValue) { Text($0.rawValue) } } } .navigationTitle("Picker") } .buttonStyle(PlainButtonStyle()) }}
enum FruitType: String, CaseIterable { case apple case orange case banana}バグの原因について
要するにNavigationViewに.buttonStyle(PlainButtonStyle())がかかっているとForm内のPickerの表示がおかしくなってしまう。
なので、.buttonStyle(PlanButtonStyle())をネストの浅いところに書いてしまうのは良くない。特に、WindowGroupに書くと全ビューにスタイルが適応されて便利なのだが、もしも Picker を利用するつもりであれば.buttonStyle()を書く場所はしっかりと考えたほうが良い。
::: tip おまけ
iOS 向けの Style は以下の三つが使えるが、DefaultButtonStyle以外はバグが発生します。
:::
| バグ | |
|---|---|
| PlainButtonStyle | 発生 |
| DefaultButtonStyle | 発生しない |
| BorderlessButtonStyle | 発生 |