如何在 IOS14 中使用多个 fullScreenCover
How can I use multiple fullScreenCover in IOS14
我想在一个视图中以全屏模式显示两个目的地视图。
下面是我的代码示例。似乎该功能仅适用于单个演示文稿,如果我定义了第二个 fullScreenCover,则第一个 fullScreenCover 不起作用 properly.Is 目前有任何解决方法吗?
import SwiftUI
struct TesFullScreen: View {
init(game : Int){
print(game)
}
var body: some View {
Text("Full Screen")
}
}
内容视图
import SwiftUI
struct ContentView: View {
@State var showFullScreen1 : Bool = false
@State var showFullScreen2 : Bool = false
var body: some View {
NavigationView {
VStack {
Spacer()
Button(action: { self.showFullScreen1 = true }) {
Text("Show Full Screen 1")
}
Button(action: { self.showFullScreen2 = true }) {
Text("Show Full Screen 2")
}
Spacer()
}
.navigationBarTitle("TextBugs", displayMode: .inline)
}
.fullScreenCover(isPresented: self.$showFullScreen1){
TesFullScreen(game: 1)
}
.fullScreenCover(isPresented: self.$showFullScreen2){
TesFullScreen(game: 2)
}
}
}
通常会忽略一个接一个添加的相同修饰符。所以最简单的解决方法是将它们附加到不同的视图,比如
struct FullSContentView: View {
@State var showFullScreen1 : Bool = false
@State var showFullScreen2 : Bool = false
var body: some View {
NavigationView {
VStack {
Spacer()
Button(action: { self.showFullScreen1 = true }) {
Text("Show Full Screen 1")
}
.fullScreenCover(isPresented: self.$showFullScreen1){
Text("TesFullScreen(game: 1)")
}
Button(action: { self.showFullScreen2 = true }) {
Text("Show Full Screen 2")
}
.fullScreenCover(isPresented: self.$showFullScreen2){
Text("TesFullScreen(game: 2)")
}
Spacer()
}
.navigationBarTitle("TextBugs", displayMode: .inline)
}
}
}
另一种方法是使用一个 .fullScreenCover(item:...
修饰符并根据输入项在不同的视图中显示。
接受的答案并不总是有效(例如,如果你有一个带有子视图(以前是单元格)的滚动视图,它包含按钮,设置导航标志)。
但我发现,您还可以将 fullScreen-modifier 添加到 EmptyView 中。此代码对我有用:
// IMPORTANT: Has to be within a container (e.g. VStack, HStack, ZStack, ...)
if myNavigation.flag1 || myNavigation.flag2 {
EmptyView().fullScreenCover(isPresented: $myNavigation.flag1)
{ MailComposer() }
EmptyView().fullScreenCover(isPresented: $myNavigation.flag2)
{ RatingStore() }
}
唯一对我有用的是 link 中的答案:
https://forums.swift.org/t/multiple-sheet-view-modifiers-on-the-same-view/35267
使用 EmptyView 方法或其他解决方案总是会破坏两个演示文稿之一的过渡动画。转换到该视图或从该视图转换并取决于我选择它们的顺序。
在 link 中使用 Lantua 的方法在所有情况下都有效:
enum SheetChoice: Hashable, Identifiable {
case a, b
var id: SheetChoice { self }
}
struct ContentView: View {
@State var sheetState: SheetChoice?
var body: some View {
VStack {
...
}
.sheet(item: $sheetState) { item in
if item == .a {
Text("A")
} else {
Text("B")
}
}
}
}
sheetState 必须是可选的才能工作。
我想在一个视图中以全屏模式显示两个目的地视图。 下面是我的代码示例。似乎该功能仅适用于单个演示文稿,如果我定义了第二个 fullScreenCover,则第一个 fullScreenCover 不起作用 properly.Is 目前有任何解决方法吗?
import SwiftUI
struct TesFullScreen: View {
init(game : Int){
print(game)
}
var body: some View {
Text("Full Screen")
}
}
内容视图
import SwiftUI
struct ContentView: View {
@State var showFullScreen1 : Bool = false
@State var showFullScreen2 : Bool = false
var body: some View {
NavigationView {
VStack {
Spacer()
Button(action: { self.showFullScreen1 = true }) {
Text("Show Full Screen 1")
}
Button(action: { self.showFullScreen2 = true }) {
Text("Show Full Screen 2")
}
Spacer()
}
.navigationBarTitle("TextBugs", displayMode: .inline)
}
.fullScreenCover(isPresented: self.$showFullScreen1){
TesFullScreen(game: 1)
}
.fullScreenCover(isPresented: self.$showFullScreen2){
TesFullScreen(game: 2)
}
}
}
通常会忽略一个接一个添加的相同修饰符。所以最简单的解决方法是将它们附加到不同的视图,比如
struct FullSContentView: View {
@State var showFullScreen1 : Bool = false
@State var showFullScreen2 : Bool = false
var body: some View {
NavigationView {
VStack {
Spacer()
Button(action: { self.showFullScreen1 = true }) {
Text("Show Full Screen 1")
}
.fullScreenCover(isPresented: self.$showFullScreen1){
Text("TesFullScreen(game: 1)")
}
Button(action: { self.showFullScreen2 = true }) {
Text("Show Full Screen 2")
}
.fullScreenCover(isPresented: self.$showFullScreen2){
Text("TesFullScreen(game: 2)")
}
Spacer()
}
.navigationBarTitle("TextBugs", displayMode: .inline)
}
}
}
另一种方法是使用一个 .fullScreenCover(item:...
修饰符并根据输入项在不同的视图中显示。
接受的答案并不总是有效(例如,如果你有一个带有子视图(以前是单元格)的滚动视图,它包含按钮,设置导航标志)。
但我发现,您还可以将 fullScreen-modifier 添加到 EmptyView 中。此代码对我有用:
// IMPORTANT: Has to be within a container (e.g. VStack, HStack, ZStack, ...)
if myNavigation.flag1 || myNavigation.flag2 {
EmptyView().fullScreenCover(isPresented: $myNavigation.flag1)
{ MailComposer() }
EmptyView().fullScreenCover(isPresented: $myNavigation.flag2)
{ RatingStore() }
}
唯一对我有用的是 link 中的答案:
https://forums.swift.org/t/multiple-sheet-view-modifiers-on-the-same-view/35267
使用 EmptyView 方法或其他解决方案总是会破坏两个演示文稿之一的过渡动画。转换到该视图或从该视图转换并取决于我选择它们的顺序。
在 link 中使用 Lantua 的方法在所有情况下都有效:
enum SheetChoice: Hashable, Identifiable {
case a, b
var id: SheetChoice { self }
}
struct ContentView: View {
@State var sheetState: SheetChoice?
var body: some View {
VStack {
...
}
.sheet(item: $sheetState) { item in
if item == .a {
Text("A")
} else {
Text("B")
}
}
}
}
sheetState 必须是可选的才能工作。