小编Áko*_*vai的帖子

SwiftUI - IOS 16 - 如何在 MVVM 架构中使用新的 NavigationStack 和 NavigationPath 进行编程导航?

描述

对于编程式导航,您之前可以使用NavigationLink(isActive:, destination:, label:) ,当isActive参数为 true时,它​​将触发导航。在 IOS 16 中,这已被弃用,并引入了NavigationStack、NavigationLink(value:, label:)NavigationPath 。

要了解这些的用法,请点击链接:

https://developer.apple.com/documentation/swiftui/migration-to-new-navigation-types https://www.hackingwithswift.com/articles/250/whats-new-in-swiftui-for-ios-16(搜索NavigationStack)

我的问题是,如果我想在不同的视图及其 ViewModel 中使用它,我应该如何使用和维护包含导航堆栈内容的数组(如 NavigationPath 对象)?

正如您在下面的代码中看到的,我创建了一个 NavigationPath 对象来将导航堆栈保存在 BaseView 或 BaseView.ViewModel 中。这样我就可以从该 BaseView 到其他页面(Page1、Page2)进行编程导航,这很棒。

但是,如果我转到 Page1 并尝试以编程方式从那里导航到 Page2,我需要访问原始的 NavigationPath 对象,即我在 BaseView 中使用的对象。

访问这个原始对象的最佳方式是什么?

我可能误解了这个新功能的用法,但如果您有任何可能的从 ViewModel 进行编程导航的解决方案,我会很高兴看到它:)

代码

我尝试做的事情:

struct BaseView: View {
    @StateObject var viewModel = ViewModel()
    
    var body: some View {
        NavigationStack(path: $viewModel.paths) {
            VStack {
                Button("Page 1", action: viewModel.goToPage1)
                Button("Page 2", action: viewModel.goToPage2)
            }
            .navigationDestination(for: String.self) { …
Run Code Online (Sandbox Code Playgroud)

mvvm ios swift swiftui swiftui-navigationstack

9
推荐指数
1
解决办法
5654
查看次数

SwiftUI - IOS 16 NavigationStack - @StateObject init 被调用两次

描述

我正在尝试使我的应用程序适应 IOS 16 中引入的新功能。当我的一个视图中NavigationStack有一个变量时,我最终出现了奇怪的行为。@StateObject

当我导航(使用 new修饰符)到具有该对象的块.navigationDestination()的新视图时,该对象将运行两次。@StateObjectinit()

视图的主体如下所示:

VStack {
    Text("Param: \(intParam) and \(viewModel.someData)")
            
    Button("Do Something") {
        viewModel.buttonTapped()
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我删除 Button 元素,则init()只会@StateObject运行一次。

如果我使用旧NavigationLink(title:destination:)元素导航到新页面,它将运行一次@StateObject init()

完整代码

struct ContentView: View {
    
    var body: some View {
        NavigationStack {
            VStack {
                NavigationLink(value: 16) {
                    Text("Tap Me (IOS 16)")
                }
                NavigationLink("Tap Me (Older)") {
                    Page2(intParam: 45)
                }
            }
            .navigationDestination(for: Int.self) { i in
                Page2(intParam: i)
            } …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui ios16 swiftui-navigationstack

6
推荐指数
1
解决办法
999
查看次数

标签 统计

ios ×2

swift ×2

swiftui ×2

swiftui-navigationstack ×2

ios16 ×1

mvvm ×1