微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI-以编程方式呈现本表

如何解决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)
})

SecondSheet

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

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

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

解决方法

以下是可能方法的演示-激活第一个工作表的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")
                    })
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。