我试图改变一个视图,而没有像你在 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)
如果您只想隐藏导航栏,这很容易:
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)
相反,如果您想摆脱NavigationView和NavigationLink视图,则必须实现自己的自定义导航。它有点复杂。以下只是两个视图之间推送/弹出转换的简单示例。
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)
任何稍后接触到这一点的人可能会发现这很有趣;简而言之,将大量数据推入@environment,在您想要的任何视图中按下按钮来触发它,并且由于它位于整个应用程序堆栈的最顶部,因此它会强制重绘,这就像全视图导航,没有整个推/弹出导航视图愚蠢的潜在丢失记忆和孤立或丢失对象。
它仍然比我想要的更“单页应用程序”,但由于 SwiftUI 的导航彻底性如此严重,所以它会做得很好。
不是我的网站,不是我的链接,不是我的教程,并且在搜索时它被埋在点击列表中,这是一种耻辱;这是最接近许多人正在寻找的东西。IMO,这应该作为一流的操作纳入 SwiftUI 中,并减少解决方法。
https://blckbirds.com/post/how-to-navigate- Between-views-in-swiftui-by-using-an-environmentobject/
| 归档时间: |
|
| 查看次数: |
8487 次 |
| 最近记录: |