视图中的 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 Picker 专注于视图中的选定项目

没有标签的 SwiftUI Picker 视图

SwiftUI视图onReceive方法接收“冗余”事件的解决

SwiftUI视图onReceive方法接收“冗余”事件的解决

SwiftUI Segmented Picker 在点击时不会切换

SwiftUI Picker 视图在 TabView 中消失