我找不到从ViewB转到ContentView的方法,而不在其他NavigationView
上显示第二个NavigationView
。
struct ContentView: View {
var body: some View {
NavigationView{
VStack {
Text("Go to ViewA")
NavigationLink(destination: ViewA()) {Text("Go")}
}.navigationBarTitle("ContentView")
}
}
}
struct ViewA: View {
@Environment(\.presentationMode) var presentationMode
var body: some View {
VStack {
Text("Go to ViewB")
NavigationLink(destination: ViewB()) {Text("Go to B")}
Text("Go back")
Button(action: { self.presentationMode.wrappedValue.dismiss() }) {Text("Go to ContentView")}
}.navigationBarTitle("ViewA")
}
}
struct ViewB: View {
@Environment(\.presentationMode) var presentationMode
var body: some View {
VStack {
Text("Go Home")
NavigationLink(destination: ContentView()) {Text("Go")}
Text("Go back")
Button(action: { self.presentationMode.wrappedValue.dismiss() }) {Text("Go to ViewB")}
}.navigationBarTitle("ViewB")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
在“旧” Swift中,我可以轻松地进行
@IBAction func unwindToVCMain(segue:UIStoryboardSegue) { }
}
并像
一样轻松地调用它performSegue(withIdentifier: "unwindToVcMain", sender: nil)
答案 0 :(得分:2)
首先,将您的第一个视图嵌入到导航控制器中。
然后插入一个导航链接到下一个视图。 NavigationLink 有不同的初始化程序。
使用 isActive
参数选择这个:
一开始有点费解,但是当点击链接并且导航移动到下一个屏幕时,isActive
中的 NavigationLink
参数变为 true
。
它创建一个实例,在活动时呈现目的地
如果我传递一个绑定来跟踪这个属性的状态,如果在我随后的视图链中的任何时候再次将它设置为 false,它将重置并返回到原始屏幕!挺整洁的!!
在代码中查看此简短示例:
struct ContentView: View {
@State private var isActive: Bool = false
var body: some View {
NavigationView {
NavigationLink(
destination: SecondView(isActive: $isActive),
isActive: $isActive,
label: {
Text("Go to second View")
})
.navigationTitle("MainView")
}
}
}
我的第二个视图:
struct SecondView: View {
@Binding var isActive: Bool
var body: some View {
NavigationLink("Go to Third View",destination: ThirdView(isActive: $isActive))
.navigationTitle("Second View")
}
}
这里是放松按钮,但它可以在任何视图中。
设置 isActive = false
在这里有一些魔力!
struct ThirdView: View {
@Binding var isActive: Bool
var body: some View {
Button("Unwind!"){
isActive = false
}
.navigationTitle("Last View!")
}
}
答案 1 :(得分:0)
我也在寻找那种方法。
我采用了两次调用self.presentationMode.wrappedValue.dismiss()
的方法,但是它与取消事务的行为并不完全相同。