SwiftUI - presentar hoja programáticamente
Me gustaría que aparezca una hoja modal con varias opciones para que el usuario elija. (La hoja para compartir es un ejemplo perfecto). Cuando el usuario hace una selección, la hoja de opciones desaparece y aparece una segunda hoja con la opción seleccionada. En el ejemplo de hoja compartida, si el usuario selecciona imprimir, la hoja compartida se desliza hacia abajo y la hoja de impresión aparece.
Puedo conseguir que la hoja de opciones aparezca con bastante facilidad. Pero no he descubierto cómo hacer que aparezca la segunda hoja. Intenté adjuntar la hoja a una vista vacía y luego usé UserDefaults para configurar el bool que activa la segunda hoja. Nada.
Primera hoja
Button(action: {
UserDefaults.standard.set(true, forKey: showSelectedOption)
showOptionForm = true
}) {
Image(systemName: "square.and.arrow.up")
}
.sheet(isPresented: $showOptionForm) {
OptionView().environment(\.managedObjectContext, self.moc)
})
Segunda hoja
EmptyView()
.sheet(isPresented: $showSelectedOption) {
SelectedOptionView().environment(\.managedObjectContext, self.moc)
}
Intenté configurar el bool que se muestra a continuación en .onAppear, pero no se llama cuando se descarta una hoja modal. ¿Hay alguna forma de saber cuándo una vista ya no está cubierta por una hoja? En UIKit habría sido presentationControllerDidDismiss (_ :). Por supuesto, esto supone que mi idea de adjuntar la segunda hoja a una vista vacía es incluso viable.
let showSelectedOption = UserDefaults.standard.bool(forKey: "showSelectedOption")
Respuestas
Aquí hay una demostración de un posible enfoque: activa la segunda hoja en la onDismissprimera. Probado con Xcode 12 / iOS 14.
struct DemoTwoSheets: View {
@State private var firstSheet = false
@State private var secondSheet = false
var body: some View {
VStack {
Button("Tap") { self.firstSheet = true }
.sheet(isPresented: $firstSheet, onDismiss: { self.secondSheet = true }) { Text("First sheet") } EmptyView() .sheet(isPresented: $secondSheet) {
Text("Second sheet")
}
}
}
}
Actualizar:
Aquí hay una alternativa que también funciona para SwiftUI 1.0. Probado con Xcode 11.4 / iOS 13.4 y Xcode 12b5 / iOS 14.
struct DemoTwoSheets: View {
@State private var firstSheet = false
@State private var secondSheet = false
var body: some View {
VStack {
Button("Tap") { self.firstSheet = true }
.sheet(isPresented: $firstSheet, onDismiss: { self.secondSheet = true }) { Text("First sheet") } .background(Color.clear .sheet(isPresented: $secondSheet) {
Text("Second sheet")
})
}
}
}