Skip to main content

Pickerでチェックボックスが表示されないバグ

tkglingLess than 1 minuteProgrammingSwift

Picker が正しく表示されない

Picker でチェックボックスが表示されないバグはstack overflowopen in new windowでも報告されていて、いろいろ解決法が載っていますが、この方法では解決しません。

バグについて

  • 選択しているにも関わらずチェックマークが表示されない
  • 選択範囲がおかしい
    • 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()を書く場所はしっかりと考えたほうが良い。

おまけ

iOS 向けの Style は以下の三つが使えるが、DefaultButtonStyle以外はバグが発生します。

バグ
PlainButtonStyle発生
DefaultButtonStyle発生しない
BorderlessButtonStyle発生
Last update:
Contributors: tkgstrator