Categories
Tags
Alamofire Android AppStoreConnect AWS Bun C++ cAdvisor CFW Cloudflare Cloudflare Access Cloudflare KV Cloudflare Tunnel Cloudflare Workers D1 Deno DevContainer Discord Docker ECR ECS Edizon Emulator EmuMMC Fastlane Firestore Frida Ghidra Git GitHub GitHub Actions GitLab GPG Grafana HACGUI Heroku Homebrew Hono IDA Pro iOS IPSwitch Jailbreak Javascript JSON JWT LanPlay Linode macOS Mirakurun MongoDB NestJS NextJS Nintendo Nintendo Switch NodeJS PHP PostgreSQL Prisma Programming Prometheus Python React Realm RealmSwift Ruby Salmon Run Salmonia3+ Shogi Sideload Snap Splatoon Splatoon2 Splatoon3 SSH Stable Diffusion Starlight Swift Swift Package SwiftUI Switch TensorRT Turf War Typescript TypeScript Ubuntu Ubuntu Server VNC VPN VSCode Vue WARP Wireguard XCode Xcode yarn zsh 家電 横歩取り
450 words
2 minutes
Pickerでチェックボックスが表示されないバグ
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 | 発生 |
Pickerでチェックボックスが表示されないバグ
https://fuwari.vercel.app/posts/2021/05/picker/