如何在没有导航视图或弹出窗口的情况下切换视图?

HUG*_*ARI 11 swiftui

我试图改变一个视图,而没有像你在 swift 中使用 segue 时那样。但我想出的唯一解决方案是使用导航栏 navigationBar 或弹出框。

struct view1: View {

    var body: some View{

        Button(action: {
//          go to view2``
        }) {
            Text("press")
        }

    }
}
Run Code Online (Sandbox Code Playgroud)
struct view2: View {

    var body: some View{
       Text("yeay")

    }
}
Run Code Online (Sandbox Code Playgroud)

sup*_*cio 9

如果您只想隐藏导航栏,这很容易:

import SwiftUI

struct View2: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

    var body: some View {
        VStack {
            Button(action: {
                self.presentationMode.wrappedValue.dismiss()
            }) {
                Text("POP")
            }
        }
        .navigationBarTitle("")
        .navigationBarBackButtonHidden(true)
        .navigationBarHidden(true)
    }
}

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: View2()) {
                Text("PUSH")
                    .navigationBarTitle("")
                    .navigationBarHidden(true)
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
Run Code Online (Sandbox Code Playgroud)

相反,如果您想摆脱NavigationViewNavigationLink视图,则必须实现自己的自定义导航。它有点复杂。以下只是两个视图之间推送/弹出转换的简单示例。

import SwiftUI

struct View2: View {
    @Binding var push: Bool

    var body: some View {
        ZStack {
            Color.yellow
            Button(action: {
                withAnimation(.easeOut(duration: 0.3)) {
                    self.push.toggle()
                }
            }) {
                Text("POP")
            }
        }
        .edgesIgnoringSafeArea(.all)
    }
}

struct View1: View {
    @Binding var push: Bool

    var body: some View {
        ZStack {
            Color.green
            Button(action: {
                withAnimation(.easeOut(duration: 0.3)) {
                    self.push.toggle()
                }
            }) {
                Text("PUSH")
            }
        }
        .edgesIgnoringSafeArea(.all)
    }
}

struct ContentView: View {
    @State private var push = false

    var body: some View {
        ZStack {
            if !push {
                View1(push: $push)
                    .transition(.asymmetric(insertion: .move(edge: .leading), removal: .move(edge: .leading)))
            }

            if push {
                View2(push: $push)
                    .transition(.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .trailing)))
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
  static var previews: some View {
    ContentView()
  }
} 
Run Code Online (Sandbox Code Playgroud)


Chr*_*isH 5

任何稍后接触到这一点的人可能会发现这很有趣;简而言之,将大量数据推入@environment,在您想要的任何视图中按下按钮来触发它,并且由于它位于整个应用程序堆栈的最顶部,因此它会强制重绘,这就像全视图导航,没有整个推/弹出导航视图愚蠢的潜在丢失记忆和孤立或丢失对象。

它仍然比我想要的更“单页应用程序”,但由于 SwiftUI 的导航彻底性如此严重,所以它会做得很好。

不是我的网站,不是我的链接,不是我的教程,并且在搜索时它被埋在点击列表中,这是一种耻辱;这是最接近许多人正在寻找的东西。IMO,这应该作为一流的操作纳入 SwiftUI 中,并减少解决方法。

https://blckbirds.com/post/how-to-navigate- Between-views-in-swiftui-by-using-an-environmentobject/

  • 链接似乎已损坏 (3认同)