Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save tazmancoder/bf1a7ded1f7f0d8b5f246dad6c620b04 to your computer and use it in GitHub Desktop.
Save tazmancoder/bf1a7ded1f7f0d8b5f246dad6c620b04 to your computer and use it in GitHub Desktop.
Multiple sheets in SwiftUI
class SettingsSheet: SheetState<SettingsSheet.State> {
enum State {
case attributions
case email
case feedback
case instructions
case licenseAgreement
case privacyPolicy
}
}
struct SettingsView: View {
@ObservedObject var sheet = SettingsSheet()
var body: some View {
VStack {
Button("Attributions") { self.sheet.state = .attributions }
Button("Email") { self.sheet.state = .email }
Button("Feedback") { self.sheet.state = .feedback }
Button("Instructions") { self.sheet.state = .instructions }
Button("License Agreement") { self.sheet.state = .licenseAgreement }
Button("Privacy Policy") { self.sheet.state = .privacyPolicy }
}
.sheet(isPresented: $sheet.isShowing, content: sheetContent)
}
@ViewBuilder
private func sheetContent() -> some View {
if sheet.state == .attributions {
AttributionsView()
} else if sheet.state == .email {
EmailView()
} else if sheet.state == .feedback {
FeedbackView()
} else if self.sheet.state == .instructions {
InstructionsView()
} else if self.sheet.state == .licenseAgreement {
WebView(url: Policy.licenseURL)
} else if self.sheet.state == .privacyPolicy {
WebView(url: Policy.privacyURL)
} else {
EmptyView()
}
}
}
import Combine
class SheetState<State>: ObservableObject {
@Published var isShowing = false
@Published var state: State? {
didSet { isShowing = state != nil }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment