ios - 返回 SwiftUI 中的特定 View (popToViewController)

标签 ios swift uikit swiftui

SwiftUI 中是否可以返回到特定 View ?假设我这样有三种观点:

struct View1: View {
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: View2()) {
                    Text("Navigate to View2")
                }
                .navigationBarTitle("View1")
            }
        }
    }
}

struct View2: View {
    var body: some View {
        NavigationLink(destination: View3()) {
            Text("Navigate to View3")
        }
        .navigationBarTitle("View2")
    }
}

struct View3: View {
    var body: some View {
        Text("View3!")
    }
}

#if DEBUG
struct ContentView_Previews: PreviewProvider {
  static var previews: some View {
    View1()
  }
}
#endif

导航可以来回工作:

View1->View2->View3
View3->View2->View1

是否可以从View3直接返回到View1?我正在寻找类似于 UIKit

的东西
func popToViewController(_ viewController: UIViewController, 
                animated: Bool) -> [UIViewController]?

最佳答案

为了解决这个问题,我最终创建了一个名为 swiftui-navigation-stack ( https://github.com/biobeats/swiftui-navigation-stack ) 的开源项目。它包含 NavigationStackView,这是一个模仿标准 NavigationView 的所有导航行为的 View ,并添加了一些其他功能(所有功能均在存储库的自述文件中进行了解释)。要回答上面的问题,我们可以这样使用 NavigationStackView:

假设我们必须实现这样的导航:

View1 (push)-> View2 (push)-> View3 (push)-> View4 (pop)-> View2

首先将您的第一个 View 嵌入 NavigationStackView 中(就像使用标准 NavigationView 一样):

struct RootView: View {
    var body: some View {
        NavigationStackView {
            View1()
        }
    }
} 

让我们创建这些简单的 View 来构建示例:

struct View1: View {
    var body: some View {
        ZStack {
            Color.yellow.edgesIgnoringSafeArea(.all)
            VStack {
                Text("VIEW 1")
                Spacer()
                PushView(destination: View2(), destinationId: "view2") {
                    Text("PUSH TO VIEW 2")
                }
            }
        }
    }
}

struct View2: View {
    var body: some View {
        ZStack {
            Color.green.edgesIgnoringSafeArea(.all)
            VStack {
                Text("VIEW 2")
                Spacer()
                PushView(destination: View3()) {
                    Text("PUSH TO VIEW 3")
                }
            }
        }
    }
}

struct View3: View {
    var body: some View {
        ZStack {
            Color.gray.edgesIgnoringSafeArea(.all)
            VStack {
                Text("VIEW 3")
                Spacer()
                PushView(destination: View4()) {
                    Text("PUSH TO VIEW 4")
                }
            }
        }
    }
}

struct View4: View {
    var body: some View {
        ZStack {
            Color.white.edgesIgnoringSafeArea(.all)
            VStack {
                Text("VIEW 4")
                Spacer()
                PopView(destination: .view(withId: "view2")) {
                    Text("POP TO VIEW 2")
                }
            }
        }
    }
}

PushViewPopView 让您可以在 View 之间导航,除此之外,它们还可以让您指定 View 的标识符(以便您可以在以下情况下返回该 View ):你需要)。

下面是完整的例子,你可以复制粘贴到xCode中自己尝试一下:

import SwiftUI
import NavigationStack

struct RootView: View {
    var body: some View {
        NavigationStackView {
            View1()
        }
    }
}

struct View1: View {
    var body: some View {
        ZStack {
            Color.yellow.edgesIgnoringSafeArea(.all)
            VStack {
                Text("VIEW 1")
                Spacer()
                PushView(destination: View2(), destinationId: "view2") {
                    Text("PUSH TO VIEW 2")
                }
            }
        }
    }
}

struct View2: View {
    var body: some View {
        ZStack {
            Color.green.edgesIgnoringSafeArea(.all)
            VStack {
                Text("VIEW 2")
                Spacer()
                PushView(destination: View3()) {
                    Text("PUSH TO VIEW 3")
                }
            }
        }
    }
}

struct View3: View {
    var body: some View {
        ZStack {
            Color.gray.edgesIgnoringSafeArea(.all)
            VStack {
                Text("VIEW 3")
                Spacer()
                PushView(destination: View4()) {
                    Text("PUSH TO VIEW 4")
                }
            }
        }
    }
}

struct View4: View {
    var body: some View {
        ZStack {
            Color.white.edgesIgnoringSafeArea(.all)
            VStack {
                Text("VIEW 4")
                Spacer()
                PopView(destination: .view(withId: "view2")) {
                    Text("POP TO VIEW 2")
                }
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        RootView()
    }
}

结果是:

enter image description here

关于ios - 返回 SwiftUI 中的特定 View (popToViewController),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57700532/

相关文章:

适用于 Visual Studio 2010 的 iOS 云存储 API

ios - 在 swift 中使用新的 Podfile 时如何忽略警告?

swift - 这个最小的 UITextFieldDelegate 实现中缺少什么导致崩溃?

ios - 如何在 UIStackView 中等距放置标签?

ios - iOS 7+ 中纯色的 UISearchBar

ios - 如何在 DidReceiveLocalNotification 的警报处理程序/闭包中添加来自 VC 的方法?

ios - 检测到 iPhone/iPad 的敲击声/拍手声

objective-c - 单例不立即更新变量

swift - 以编程方式使用约束的自定义 UIView

ios - 是否有某种 UIAccessibility 提示音?