SwiftUI - mempresentasikan sheet secara terprogram

Aug 31 2020

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

2 Asperi Aug 31 2020 at 22:06

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")
                    })
        }
    }
}