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 | 発生 |