首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在swiftUI中显示来自多个选项的工作表

在swiftUI中显示来自多个选项的工作表
EN

Stack Overflow用户
提问于 2020-09-17 12:46:09
回答 1查看 219关注 0票数 2

跟进iOS14 introducing errors with @State bindings的问题

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

代码语言:javascript
复制
enum ActiveSheet {
    case speakerDetails, micDetails, ampDetails, settings
}
代码语言:javascript
复制
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))
                }
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-17 13:23:30

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

代码语言:javascript
复制
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)中的那样):

代码语言:javascript
复制
struct SettingsView: View {
    @Environment(\.presentationMode) private var presentationMode

    var body: some View {
        Text("SettingsView")
            .onTapGesture {
                presentationMode.wrappedValue.dismiss()
            }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63938343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档