modal-dialog - 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")
解决方案
这是可能的方法的演示 - 您激活第一张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")
})
}
}
}
推荐阅读
- sql - 内连接查询 - oracle
- bootstrap-select - bootstrap_select 不会使用 YADCF 打开
- python - Python Asyncio如何同时处理超过1个请求的itertools.cycle
- python - SECURE_SSL_REDIRECT 什么都不做
- r - group_by() 然后 count() 和只是 count() 之间的区别?
- c# - 动态添加时无法创建未知类型
- javascript - 记住跨页面的动画位置
- java - gRPC 如何在客户端等待来自 StreamingServer 的标头
- amazon-web-services - 在 Bamboo 中或通过 Bamboo 部署 Lambda 函数
- spring-data-jpa - com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通信链接失败 & 数据库消失 & sql cmd line auto close