关闭 .fullScreenCover 或 .sheet 后的 SwiftUI Picker 问题

标签 swiftui picker

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

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

示例 gif:/image/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"
            
        }
    }
}

最佳答案

我完全同意系统中存在错误。但是,您可以绕过它。 这是对我有用的解决方法,已在 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"
        }
    }
}

关于关闭 .fullScreenCover 或 .sheet 后的 SwiftUI Picker 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69697944/

相关文章:

swiftui - 文本字段 swiftui xcode 13

ios - SwiftUI:什么是@AppStorage 属性包装器

带有 Xcode 11 beta 7 的 SwiftUI 不更新 List/ForEach 的内容

python - Matplotlib 事件处理线选择器

android - React Native Picker 不更新状态

ios - 如何删除swiftUI中的顶部安全区域

ios - 有没有办法在 SwiftUI 中创建新的手势?

java - Android 蓝牙设备选择器使用

SwiftUI 分段选取器在单击时不会切换

jsf - jsf 的日期+时间选择器