【问题标题】:SwiftUI Picker problem after dismissing .fullScreenCover or .sheet关闭 .fullScreenCover 或 .sheet 后的 SwiftUI Picker 问题
【发布时间】:2023-03-06 19:18:01
【问题描述】:

我有一个可以正常工作的选择器,直到显示和关闭 fullScreenCover 或工作表。有谁知道这个示例代码有什么问题,或者有解决方法吗?

我也尝试过使用 self.presentation.wrappedValue.dismiss() 关闭工作表,但结果相同。

示例 gif:https://i.stack.imgur.com/zmcmv.gif

代码:

import SwiftUI

struct ContentView: View {
    @State var selectedFilterStatus = ActiveStatus.active
    @State var showDetail = false
    
    var body: some View {
        NavigationView {
            VStack {
                Button(action: {
                    showDetail.toggle()
                }, label: {
                    Text("Detail popup")
                })
                
                Picker("\(selectedFilterStatus.title)", selection: $selectedFilterStatus) {
                    Text(ActiveStatus.active.title).tag(ActiveStatus.active)
                    Text(ActiveStatus.inactive.title).tag(ActiveStatus.inactive)
                }
            }
            .fullScreenCover(isPresented: $showDetail, content: {
                MyDetailsView(presenting: $showDetail)
            })
        }
        .navigationTitle("Main")
    }
}

struct MyDetailsView: View {
    @Binding var presenting: Bool
    
    var body: some View {
        VStack {
            Text("Hello from details!")
            Button(action: {
                presenting.toggle()
            }, label: {
                HStack {
                    Image(systemName: "chevron.left")
                    Text("Back")
                }
            })
        }
    }
}

enum ActiveStatus: String, CaseIterable, Identifiable {
    case active
    case inactive
    
    var id: String { self.rawValue }
}

extension ActiveStatus {
    var title: String {
        switch self {
        case .active:
            return "Active for sale"
        case .inactive:
            return "Inactive"
            
        }
    }
}

【问题讨论】:

  • 在我看来确实是一个 SwiftUI 错误。您是否向 Apple 提交过反馈?
  • 我也看到了同样的问题。我还对代码进行了一些操作,发现在Picker 中使用ForEach 表现出相同的行为。此外,如果您在导航到详细信息之前未进行选择器选择,则它可以正常工作。只有在进行选择器选择然后导航选择器失败之后。请在提交此文件时发布您的雷达号。
  • @jnpdx 是的,我同意。它看起来像一个错误。我还没有向苹果提交。我希望也许有人知道解决方法......
  • @Yrb,我也注意到了,但我不明白为什么......
  • 一致认为这是一个错误。不要试图理解它为什么在做它正在做的事情。只需提交报告,并张贴编号,以便我们参考。你找到了,你会得到第一个 dibs。

标签: swiftui picker


【解决方案1】:

我完全同意系统中存在错误。但是,您可以绕过它。 这是对我有用的解决方法,在 ios-15 和 macCatalyst (macos12.01) 设备上进行了测试:

import SwiftUI

@main
struct TestApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

struct ContentView: View {
    @State var selectedFilterStatus = ActiveStatus.active
    @State var showDetail: ActiveStatus? // <-- here
    
    var body: some View {
        NavigationView {
            VStack {
                Button(action: {
                    showDetail = ActiveStatus.active  // <-- here
                }, label: { Text("Detail popup") })
                
                Picker("\(selectedFilterStatus.title)", selection: $selectedFilterStatus) {
                    Text(ActiveStatus.active.title).tag(ActiveStatus.active)
                    Text(ActiveStatus.inactive.title).tag(ActiveStatus.inactive)
                }.pickerStyle(.menu)
                
            }
            // -- here --
            .fullScreenCover(item: $showDetail) { _ in
                MyDetailsView()
            }
        }
        .navigationViewStyle(.stack)
        .navigationTitle("Main")
    }
}

struct MyDetailsView: View {
    @Environment(\.dismiss) var dismiss  // <-- here
    
    var body: some View {
        VStack {
            Text("Hello from details!")
            Button(action: {
                dismiss()  // <-- here
            }, label: {
                HStack {
                    Image(systemName: "chevron.left")
                    Text("Back")
                }
            })
        }
    }
}

enum ActiveStatus: String, CaseIterable, Identifiable {
    case active
    case inactive
    
    var id: String { self.rawValue }
}

extension ActiveStatus {
    var title: String {
        switch self {
        case .active:
            return "Active for sale"
        case .inactive:
            return "Inactive"
        }
    }
}

【讨论】:

  • 感谢@workingdog!那行得通:)我不确定我是否理解为什么,是因为以这种方式使用 showDetail 会强制刷新视图吗?
  • 我也不明白它为什么会起作用。也许这个错误在fullScreenCover 的另一个“版本”中,而不是在这个版本中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 2021-05-25
  • 1970-01-01
  • 2015-08-06
相关资源
最近更新 更多