SwiftUI - mempresentasikan sheet secara terprogram
Saya ingin sebuah modal sheet muncul dengan beberapa opsi untuk dipilih pengguna. (Lembar saham adalah contoh sempurna.) Saat pengguna membuat pilihan, lembar opsi menghilang dan lembar kedua muncul dengan opsi yang dipilih. Dalam contoh lembar berbagi, jika pengguna memilih cetak, lembar berbagi meluncur ke bawah dan lembar cetakan muncul.
Saya bisa membuat lembar opsi muncul dengan cukup mudah. Tetapi saya belum menemukan cara untuk menampilkan lembar kedua. Saya mencoba melampirkan lembar ke tampilan kosong dan kemudian menggunakan UserDefaults untuk mengatur bool yang mengaktifkan lembar kedua. Tidak ada.
Lembar Pertama
Button(action: {
UserDefaults.standard.set(true, forKey: showSelectedOption)
showOptionForm = true
}) {
Image(systemName: "square.and.arrow.up")
}
.sheet(isPresented: $showOptionForm) {
OptionView().environment(\.managedObjectContext, self.moc)
})
SecondSheet
EmptyView()
.sheet(isPresented: $showSelectedOption) {
SelectedOptionView().environment(\.managedObjectContext, self.moc)
}
Saya mencoba mengatur bool yang ditunjukkan di bawah ini di .onAppear, tetapi tidak dipanggil ketika lembar modal diberhentikan. Adakah cara untuk mengetahui saat tampilan tidak lagi tertutup oleh lembaran? Di UIKit itu akan menjadi presentasiControllerDidDismiss (_ :). Tentu saja, ini mengasumsikan bahwa ide saya untuk melampirkan lembar kedua ke tampilan kosong bahkan bisa diterapkan.
let showSelectedOption = UserDefaults.standard.bool(forKey: "showSelectedOption")
Jawaban
Berikut ini demo pendekatan yang mungkin - Anda mengaktifkan lembar kedua di lembar onDismisspertama. Diuji dengan 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")
}
}
}
}
Memperbarui:
Ini adalah alternatif yang berfungsi untuk SwiftUI 1.0 juga. Diuji dengan Xcode 11.4 / iOS 13.4 dan 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")
})
}
}
}