【问题标题】:Displaying a Sheet from multiple options in swiftUI在 swiftUI 中显示来自多个选项的工作表
【发布时间】:2020-09-17 12:46:09
【问题描述】:

追问iOS14 introducing errors with @State bindings

我从几个选项中显示了一个模式表,具体取决于按下的按钮。但是,现在在 iOS14 中,当工作表显示时,由于 selectedSpeaker/selectedMicrophone/selectedAmp 为 nil 导致出现致命错误。我正在尝试更改为.sheet(item:, content:),但我看不到如何实现枚举,然后传入适当的选定对象。这就是我之前所做的:

enum ActiveSheet {
    case speakerDetails, micDetails, ampDetails, settings
}
struct FavoritesView: View {
    @State private var selectedSpeaker: Speaker?
    @State private var selectedMicrophone: Microphone?
    @State private var selectedAmp: Amplifier?

    @State private var showingSheet = false
    @State private var activeSheet: ActiveSheet = .settings  

    var body: some View {
    
    List {
        Button(action: {
            self.activeSheet = .settings
            self.showingSheet = true
            }, label: { Text("Settings")})

        Button(action: {
            self.activeSheet = .micDetails
            self.selectedMicrophone = microphones[0]
            self.showingSheet = true
            }, label: { Text("Mic 1")})

        Button(action: {
            self.activeSheet = .micDetails
            self.selectedMicrophone = microphones[1]
            self.showingSheet = true
            }, label: { Text("Mic 2")})

        Button(action: {
            self.activeSheet = .speakerDetails
            self.showingSheet = true
            self.selectedSpeaker = speakers[0]
            }, label: { Text("Speaker 1")})

        Button(action: {
            self.activeSheet = .speakerDetails
            self.showingSheet = true
            self.selectedSpeaker = speakers[1]
            }, label: { Text("Speaker 2")})

    //and so on for activeSheet = .ampDetails in the same way.
        
    }
      .sheet(isPresented: self.$showingSheet) {
                if self.activeSheet == .speakerDetails {
                    SpeakerDetailView(speaker: self.selectedSpeaker!)
                }
                else if self.activeSheet == .micDetails {
                MicDetailView(microphone: self.selectedMicrophone!)
                }
                else if self.activeSheet == .ampDetails {
                AmpDetailView(amp: self.selectedAmp!)
                } else if self.activeSheet == .settings {
                    SettingsView(showSheet: self.$showingSheet))
                }
            }
        }
    }
}

【问题讨论】:

标签: ios swift swiftui


【解决方案1】:

这是解决您的问题的另一种方法,它使用 sheet(item:content:)

struct ContentView: View {
    @State private var selectedSpeaker: Speaker?
    @State private var selectedMicrophone: Microphone?
    @State private var selectedAmp: Amplifier?
    @State private var showSettingsSheet = false

    var body: some View {
        List {
            settingsSection
            microphonesSection
            // more sections
        }
    }
    
    var settingsSection: some View {
        Button(action: {
            self.showSettingsSheet = true
        }) {
            Text("Settings")
        }
        .sheet(isPresented: self.$showSettingsSheet) {
            SettingsView()
        }
    }
    
    @ViewBuilder
    var microphonesSection: some View {
        Button(action: {
            self.selectedMicrophone = microphones[0]
        }) {
            Text("Mic 1")
        }
        Button(action: {
            self.selectedMicrophone = microphones[1]
        }) {
            Text("Mic 2")
        }
        .sheet(item: self.$selectedMicrophone) {
            MicDetailView(microphone: $0)
        }
    }
}

这样你也不需要enum ActiveSheet


您始终可以使用@Environment(\.presentationMode) 关闭工作表,无需将变量传递给工作表(如SettingsView(showSheet: self.$showingSheet)):

struct SettingsView: View {
    @Environment(\.presentationMode) private var presentationMode

    var body: some View {
        Text("SettingsView")
            .onTapGesture {
                presentationMode.wrappedValue.dismiss()
            }
    }
}

【讨论】:

    猜你喜欢
    • 2021-06-28
    • 2020-10-12
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多