我在用着TabView
在我的主页上。假设我有 4 个选项卡。
在第二个选项卡上,我可以使用转到另一个视图NavigationLink
我使用另外两个视图NavigationLink
。然后在最新的视图上,有一个按钮可以呈现视图,我使用.fullScreenCover
(因为我想全屏显示它)。
在呈现视图中,我添加了一个X
标记在左侧navigationBarItems
解雇。我用@Environment(\.presentationMode) var presentationMode
and presentationMode.wrappedValue.dismiss()
解雇。但它只会将当前视图忽略到前一个视图,而实际上我想将它忽略到视图的根目录,即我的视图的第二个选项卡TabView
.
有没有办法做到这一点?因为我查阅了一些文章,但没有任何相关的内容,特别是TabView
语境。
我也有一个问题:
- 这是正确的使用方法吗
.fullScreenCover
?或者是否有另一种可能的解决方案,例如呈现全屏样式的模式(如果有任何原因我也不确定)。
任何建议将不胜感激,提前谢谢您。
The presentationMode
是一级效果值,即关闭当前显示的屏幕后更改它。
因此,要关闭许多呈现的屏幕,您必须以编程方式实现此操作,如下面的演示所示。
可能的方法是使用自定义EnvironmentKey
将其向下传递视图层次结构,无需每个级别视图的紧密耦合(如绑定),并且仅在需要的该级别注入/调用。
使用 Xcode 12.4 / iOS 14.4 测试演示
struct ContentView: View {
var body: some View {
TabView {
Text("Tab1")
.tabItem { Image(systemName: "1.square") }
Tab2RootView()
.tabItem { Image(systemName: "2.square") }
}
}
}
struct Tab2RootView: View {
@State var toRoot = false
var body: some View {
NavigationView {
Tab2NoteView(level: 0)
.id(toRoot) // << reset to root !!
}
.environment(\.rewind, $toRoot) // << inject here !!
}
}
struct Tab2NoteView: View {
@Environment(\.rewind) var rewind
let level: Int
@State private var showFullScreen = false
var body: some View {
VStack {
Text(level == 0 ? "ROOT" : "Level \(level)")
NavigationLink("Go Next", destination: Tab2NoteView(level: level + 1))
Divider()
Button("Full Screen") { showFullScreen.toggle() }
.fullScreenCover(isPresented: $showFullScreen,
onDismiss: { rewind.wrappedValue.toggle() }) {
Tab2FullScreenView()
}
}
}
}
struct RewindKey: EnvironmentKey {
static let defaultValue: Binding<Bool> = .constant(false)
}
extension EnvironmentValues {
var rewind: Binding<Bool> {
get { self[RewindKey.self] }
set { self[RewindKey.self] = newValue }
}
}
struct Tab2FullScreenView: View {
@Environment(\.presentationMode) var mode
var body: some View {
Button("Close") { mode.wrappedValue.dismiss() }
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)