视图中的 SwiftUI Picker 会在点击时自行禁用
Posted
技术标签:
【中文标题】视图中的 SwiftUI Picker 会在点击时自行禁用【英文标题】:SwiftUI Picker in view disables itself on tap 【发布时间】:2021-05-21 01:35:24 【问题描述】:所以我是 SwiftUI 的新手
我试图在我的视图中有一个表单,我有一个选择器遍历枚举。但是当我点击选择器启动它时它变灰并且什么也不做,我必须离开视图然后回来。
I've attached a gif of whats going on.
我已经将我的选择器包装在导航视图中,并且它第二次工作了,所以我不认为就是这样。我不太确定还能尝试什么。
这是我的快速视图
import SwiftUI
enum TestEnum: String, Equatable, CaseIterable
case MORNING = "Morning"
case BREAKFAST = "Breakfast"
case LUNCH = "Lunch"
case AFTERNOON = "Afternoon"
case DINNER = "Dinner"
case EVENING = "Evening"
case BEDTIME = "Bedtime"
case OTHER = "Other or As Needed"
var id: String rawValue
var localizedName: LocalizedStringKey LocalizedStringKey(rawValue)
struct FormPage: View
@State var selection = TestEnum.AFTERNOON
var body: some View
VStack
Text("Some Text")
NavigationView
Form
Picker("When do you take this", selection: $selection)
ForEach(TestEnum.allCases, id: \.id) value in
Text(value.rawValue)
.tag(value)
.navigationViewStyle(StackNavigationViewStyle())
.navigationBarHidden(true)
.navigationBarBackButtonHidden(true)
struct FormPage_Previews: PreviewProvider
static var previews: some View
FormPage()
struct ContentView: View
@State private var currentTab = 0
var body: some View
TabView(selection: $currentTab,
content:
Text("One")
.tag(0)
.padding()
FormPage()
.tag(1)
.padding()
)
.tabViewStyle(PageTabViewStyle())
.indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .never))
.animation(.default)
struct ContentView_Previews: PreviewProvider
static var previews: some View
ContentView()
@main
struct testApp: App
var body: some Scene
WindowGroup
ContentView()
【问题讨论】:
minimal reproducible example 会很好,因为您已经包含了一堆自定义类型,因此您的示例不会为任何试图测试它的人编译。 我已经这样做了,视频明显不同但仍然。 在我看来确实是一个 SwiftUI 错误。看起来它因为TabView
中的NavigationView
而变得一团糟——即使MenuPickerStyle
行为不正常,即使它没有使用导航视图。也许其他人会有一个修复的想法。否则,您可能需要考虑不同的选择器样式/用户体验。
呃..:.没有什么比在框架中发现错误更重要了。谢谢你给我增加理智。有没有一种简单的方法可以在选项卡式视图中使用表单。我没有附加到选项卡视图,只是为了方便登录。
【参考方案1】:
如果您将 NavigationView 移动到 ContentView,它至少对我来说有效(macos 11.4、xcode 12.5、target ios 14.5 和 macCatalyst),如下所示:
struct FormPage: View
@State var selection = TestEnum.AFTERNOON
var body: some View
VStack
Text("Some Text")
Form
Picker("When do you take this", selection: $selection)
ForEach(TestEnum.allCases, id: \.id) value in
Text(value.rawValue)
.tag(value)
struct ContentView: View
@State private var currentTab = 0
var body: some View
NavigationView
TabView(selection: $currentTab,
content:
Text("One")
.tag(0)
.padding()
FormPage()
.tag(1)
.padding()
)
.tabViewStyle(PageTabViewStyle())
.indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .never))
.animation(.default)
.navigationViewStyle(StackNavigationViewStyle())
.navigationBarHidden(true)
.navigationBarBackButtonHidden(true)
【讨论】:
以上是关于视图中的 SwiftUI Picker 会在点击时自行禁用的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI视图onReceive方法接收“冗余”事件的解决
SwiftUI视图onReceive方法接收“冗余”事件的解决