首页 > 解决方案 > SwiftUI - 以编程方式呈现工作表

问题描述

我希望出现一个模式表,其中包含多个选项供用户选择。(共享表就是一个很好的例子。)当用户做出选择时,选项表消失,第二个表出现,其中包含选定的选项。在共享表示例中,如果用户选择打印,则共享表向下滑动并弹出打印表。

我可以让选项表很容易出现。但我还没有弄清楚如何让第二张纸出现。我尝试将工作表附加到一个空视图,然后使用 UserDefaults 设置激活第二个工作表的布尔值。没有什么。

第一张

Button(action: {
   UserDefaults.standard.set(true, forKey: showSelectedOption)
   showOptionForm = true
}) {
   Image(systemName: "square.and.arrow.up")
}
.sheet(isPresented: $showOptionForm) {
   OptionView().environment(\.managedObjectContext, self.moc)
})

第二张

EmptyView()
   .sheet(isPresented: $showSelectedOption) {
      SelectedOptionView().environment(\.managedObjectContext, self.moc)
}

我尝试在 .onAppear 中设置下面显示的布尔值,但是当模式表被解除时它不会被调用。有没有办法判断视图何时不再被工作表覆盖?在 UIKit 中它应该是presentationControllerDidDismiss(_:)。当然,这是假设我将第二张纸附加到空视图的想法甚至是可行的。

let showSelectedOption = UserDefaults.standard.bool(forKey: "showSelectedOption")

标签: modal-dialogswiftui

解决方案


这是可能的方法的演示 - 您激活第一张onDismiss的第二张。使用 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")
                }
        }
    }
}

更新:

这是一个替代方案,它也适用于 SwiftUI 1.0。使用 Xcode 11.4 / iOS 13.4 和 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")
                    })
        }
    }
}

推荐阅读