有没有办法在 SwiftUI 中创建视图链?

问题描述 投票:0回答:1

我想在 SwiftUI 中创建一个视图链,我使用的是 NavigationView 但已被弃用,iOS 16.0 中是否有一些替代方案?

view1 -> view2 -> view3 -> view4 -> root(view3)



enum Screens {
case view1
case view2
}

extension Screens: Hashable {}

final class SettingsNavigationManager: ObservableObject {

    @Published var screen: Screens? {
        didSet {
            print("📱 \(screen)")
        }
    }
    
    func push(to screen: Screens) {
        self.screen = screen
    }
    
    func popToRoot() {
        self.screen = nil
    }

}

struct viewOne: View {
        @EnvironmentObject var settingsNavManager: SettingsNavigationManager
        var body: some View{
                Button("Go to ViewTwo") {
                        settingsNavManager.push(to: .view2)
                }
                .background(
                        NavigationLink(
                                destination: viewTwo(),
                                tag: .view2,
                                selection: $settingsNavManager.screen) { EmptyView() }
                )
        }
}

我读过有关 NavegationStack 的内容,但我知道,它类似于实现列表和详细信息项。

ios swift iphone swiftui uikit
1个回答
0
投票

https://developer.apple.com/documentation/swiftui/migrating-to-new-navigation-types

你可以在你的模型中使用 navigationPath 对象,它会为你管理推送和弹出。

我想在 SwiftUI 中创建一个视图链,我使用的是 NavigationView 但已被弃用,iOS 16.0 中是否有一些替代方案?

view1 -> view2 -> view3 -> view4 -> root(view3)

在这里输入图片描述

enum Screens { case view1 case view2 }

扩展屏幕:可散列{}

最终类 SettingsNavigationManager: ObservableObject {
@Published 变量路径:NavigationPath }

然后你用

初始化导航栈

NavigationStack(路径:$settingsNavManager.path){ }

然后就可以使用了

settingsNavigationManager.path.append()

removeLast(settingsNavManager.path.count)

作为 push 和 popToRoot

您还可以使用 navigationdestination 来根据您的屏幕枚举调整应调用哪个视图

.navigationDestination(for: Screens.self){ 屏幕输入 切换屏幕{ } }

© www.soinside.com 2019 - 2024. All rights reserved.