【问题标题】:SwiftUI - present sheet programaticallySwiftUI - 以编程方式呈现工作表
【发布时间】:2020-12-19 17:01:45
【问题描述】:

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

我可以很容易地让选项表出现。但我还没有弄清楚如何让第二张纸出现。我尝试将工作表附加到一个空视图,然后使用 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-dialog swiftui


    【解决方案1】:

    这是可能方法的演示 - 您在第一张表的 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")
                        })
            }
        }
    }
    

    【讨论】:

    • 不幸的是,这不适用于 Xcode 11.6 / iOS 13.6。我将其标记为正确,因为它将在下一个版本的 iOS 发布时工作。也许我可以使用 ObservableObject 找出替代方案...
    • 查看适用于 iOS 13 的变体的更新。
    • 一个后续问题 - 当我使用带有关闭按钮的视图时,除非您向下滑动,否则无法关闭第二张工作表。我尝试使用presentationMode 变量以及绑定变量但没有成功。我知道这是 iOS13 的一种解决方法,但您认为还有一种解决方法可以消除第二张工作表吗?谢谢!
    猜你喜欢
    • 2021-03-15
    • 1970-01-01
    • 2021-09-07
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 2012-08-13
    • 1970-01-01
    相关资源
    最近更新 更多