当选项卡之间的视图相同时,如何使用导航路径?

How to use navigation paths when views are the same across tabs?

提问人:amelia 提问时间:11/11/2023 最后编辑:amelia 更新时间:11/11/2023 访问量:32

问:

我有一个最高级别的选项卡视图,现在只有一个视图具有导航路径,因为我正在努力添加其他视图,但我首先遇到了一个阻止程序。我计划每个选项卡视图都有自己的路径。

因此,我的提要视图可以导航到我的配置文件视图,该视图可以导航到我所有选项卡下的子视图。几乎每个视图都可以存在于每个选项卡视图下,甚至可能多次存在。我希望该应用程序能够随时随地轻松访问您需要的任何内容。

我有一个枚举来浏览 feedviews 路径下的所有子视图。然后,在每个视图中,我使用: .但是,如果我的个人资料视图中的导航链接包含,那么当相同的导航链接的来源路径不是 FeedNavigation 时,我该如何重用它?NavigationLink(value: FeedNavigation.profile(user))FeedNavigation.profile(user)

我试图减少代码量,因为我认为这个问题是一个更广泛的概念,而不是修复我的实际代码。

示例:源视图 -> 个人资料视图 -> 书籍视图(FeedNavigation 路径)

示例 2:配置文件视图 -> 书籍视图 -> 可能返回到源视图(想要创建 ProfileNavigation 路径)

两个剖面图视图具有相同的导航链接,用于访问下一个视图。因此,如果我将链接绑定到特定路径,则该路径并不总是我到达那里的方式。profileview

class NavigationManager: ObservableObject {
    @Published var feedPath = [FeedNavigation]()

enum FeedNavigation: Hashable, Codable {
    case profile(User)
    case notification
    case chat
}

}
TabView(selection: $currentTab) {
    
    NavigationStack(path: $navigationManager.feedPath) {
        FeedView()
    }
    .tag(Tabs.feed)
    
    NavigationStack() {
        SearchView()
    }
    .tag(Tabs.search)
    
    NavigationStack() {
        ProfileView(user: user)
    }
    .tag(Tabs.profile)
    
}
struct FeedView: View {
    @EnvironmentObject var navigationManager: NavigationManager
    var body: some View {
        NavigationLink(value: FeedNavigation.profile(user)) {
            Text("Click to see user's profile")
        }
        .navigationDestination(for: FeedNavigation.self) { state in
            switch state {
            case .profile(let user):
                ProfileView(user: user)
            case .notification:
                NotificationsView()
            case .chat:
                ConversationsView()

        }
    }
}
struct ProfileView: View {
   var body: some View {
         NavigationLink(value: FeedNavigation.notifications)) {
           Text("Go to notifications")
       }
   }
}

在此示例代码中,现在我的所有配置文件链接都具有 FeedNavigation 路径,即使配置文件视图需要自己的路径,因为它是自己的选项卡视图。

swift 导航 swiftui-navigationlink swiftui-navigationstack

评论

0赞 lorem ipsum 11/11/2023
您可以在 ViewModifier 中重用代码,将所有导航目标放在一起。
0赞 Sweeper 11/11/2023
“重复使用相同的导航链接”是什么意思?你能展示一下你想写什么样的代码吗?它不一定必须起作用 - 只是为了给我一个想法。
0赞 amelia 11/11/2023
@Sweeper我添加了更多的代码和上下文,我认为这些代码和上下文可以更好地解释它
1赞 Sweeper 11/11/2023
我仍然没有看到这个问题。只是不叫它?具有一种类型,用于对所有选项卡的目标进行编码,并为每个选项卡提供一个新实例。然后你有 3 条不同的路径。FeedNavigationNavigationManager

答: 暂无答案