SwiftUI - 以编程方式呈现 sheet
SwiftUI - present sheet programatically
我想要一个模态 sheet 出现,其中包含多个选项供用户选择。 (共享 sheet 就是一个很好的例子。)当用户进行选择时,选项 sheet 会消失,第二个 sheet 会与所选选项一起出现。在分享sheet的例子中,如果用户选择打印,分享sheet向下滑动,弹出打印sheet。
我可以很容易地让选项 sheet 出现。但是我还没有想出如何让第二个 sheet 出现。我尝试将 sheet 附加到空视图,然后使用 UserDefaults 设置激活第二个 sheet 的 bool。没有。
第一个Sheet
Button(action: {
UserDefaults.standard.set(true, forKey: showSelectedOption)
showOptionForm = true
}) {
Image(systemName: "square.and.arrow.up")
}
.sheet(isPresented: $showOptionForm) {
OptionView().environment(\.managedObjectContext, self.moc)
})
第二Sheet
EmptyView()
.sheet(isPresented: $showSelectedOption) {
SelectedOptionView().environment(\.managedObjectContext, self.moc)
}
我尝试在 .onAppear 中设置如下所示的 bool,但是当模态 sheet 被关闭时它不会被调用。有没有办法判断视图何时不再被 sheet 覆盖?在 UIKit 中它应该是 presentationControllerDidDismiss(_:)。当然,这是假设我将第二个 sheet 附加到空视图的想法是可行的。
let showSelectedOption = UserDefaults.standard.bool(forKey: "showSelectedOption")
这是可能方法的演示 - 您在第一个 onDismiss
中激活第二个 sheet。测试 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")
})
}
}
}
我想要一个模态 sheet 出现,其中包含多个选项供用户选择。 (共享 sheet 就是一个很好的例子。)当用户进行选择时,选项 sheet 会消失,第二个 sheet 会与所选选项一起出现。在分享sheet的例子中,如果用户选择打印,分享sheet向下滑动,弹出打印sheet。
我可以很容易地让选项 sheet 出现。但是我还没有想出如何让第二个 sheet 出现。我尝试将 sheet 附加到空视图,然后使用 UserDefaults 设置激活第二个 sheet 的 bool。没有。
第一个Sheet
Button(action: {
UserDefaults.standard.set(true, forKey: showSelectedOption)
showOptionForm = true
}) {
Image(systemName: "square.and.arrow.up")
}
.sheet(isPresented: $showOptionForm) {
OptionView().environment(\.managedObjectContext, self.moc)
})
第二Sheet
EmptyView()
.sheet(isPresented: $showSelectedOption) {
SelectedOptionView().environment(\.managedObjectContext, self.moc)
}
我尝试在 .onAppear 中设置如下所示的 bool,但是当模态 sheet 被关闭时它不会被调用。有没有办法判断视图何时不再被 sheet 覆盖?在 UIKit 中它应该是 presentationControllerDidDismiss(_:)。当然,这是假设我将第二个 sheet 附加到空视图的想法是可行的。
let showSelectedOption = UserDefaults.standard.bool(forKey: "showSelectedOption")
这是可能方法的演示 - 您在第一个 onDismiss
中激活第二个 sheet。测试 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")
})
}
}
}