只有根级导航目的地对于具有同质路径的导航堆栈有效

2024-06-19

我正在尝试整合NavigationStack在我的 SwiftUI 应用程序中。

我有四个看法:CealUIApp, OnBoardingView, UserTypeView and RegisterView.

我想从OnBoardingView to UserTypeView当用户按下按钮时OnBoardingView.

并且,从UserTypeView to RegisterView当用户按下按钮时UserTypeView

下面是我的 CealUIApp 代码

@main
struct CealUIApp: App {
    
    @State private var path = [String]()
    
    var body: some Scene {
        WindowGroup {
            NavigationStack(path: $path){
                OnBoardingView(path: $path)
            }
        }
    }
}

In OnBoardingView

Button {
    path.append("UserTypeView")
}
label: {
    Text("Hello")
}
.navigationDestination(for: String.self) { string in
    UserTypeView(path: $path)
}

In UserTypeView

Button {
    path.append("RegisterView")
}
label: {
    Text("Hello")
}
.navigationDestination(for: String.self) { string in
    RegisterView()
}

当按钮打开时UserTypeView按下后,它会导航至UserTypeView代替RegisterView.

另外,Xcode 日志说

只有根级导航目的地对于具有同构路径的导航堆栈才有效。


你可以摆脱Only root-level navigation destinations are effective for a navigation stack with a homogeneous path通过将路径类型更改为NavigationPath.

@State private var path: NavigationPath = .init()

但随后您会收到一条消息/错误,我认为它更好地解释了问题A navigationDestination for “Swift.String” was declared earlier on the stack. Only the destination declared closest to the root view of the stack will be used.

Apple 认为扫描所有可用视图的效率非常低,因此他们将使用navigationDestination将优先。

试想一下,如果你的OnBoardingView还可以选择"RegisterView"

 .navigationDestination(for: String.self) { string in
        switch string{
        case "UserTypeView":
            UserTypeView(path: $path)
        case "RegisterView":
            Text("fakie register view")
        default:
            Text("No view has been set for \(string)")
        }
        
    }

SwiftUI 如何选择合适的呢?

那么如何“修复”呢?您可以尝试这个替代方案。

import SwiftUI

@available(iOS 16.0, *)
struct CealUIApp: View {
    @State private var path: NavigationPath = .init()
    var body: some View {
        NavigationStack(path: $path){
            OnBoardingView(path: $path)
                .navigationDestination(for: ViewOptions.self) { option in
                    option.view($path)
                }
        }
    }
    //Create an `enum` so you can define your options
    enum ViewOptions{
        case userTypeView
        case register
        //Assign each case with a `View`
        @ViewBuilder func view(_ path: Binding<NavigationPath>) -> some View{
            switch self{
            case .userTypeView:
                UserTypeView(path: path)
            case .register:
                RegisterView()
            }
        }
    }
}
@available(iOS 16.0, *)
struct OnBoardingView: View {
    @Binding var path: NavigationPath
    var body: some View {
        Button {
            //Append to the path the enum value
            path.append(CealUIApp.ViewOptions.userTypeView)
        } label: {
            Text("Hello")
        }
        
    }
}
@available(iOS 16.0, *)
struct UserTypeView: View {
    @Binding var path: NavigationPath
    var body: some View {
        Button {
            //Append to the path the enum value
            path.append(CealUIApp.ViewOptions.register)
        } label: {
            Text("Hello")
        }
        
    }
}
@available(iOS 16.0, *)
struct RegisterView: View {
    var body: some View {
        Text("Register")
        
    }
}
@available(iOS 16.0, *)
struct CealUIApp_Previews: PreviewProvider {
    static var previews: some View {
        CealUIApp()
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

只有根级导航目的地对于具有同质路径的导航堆栈有效 的相关文章

随机推荐

  • 有选择地设置 iskeyword

    通常我需要搜索大型 xml 模式文件以查找光标下单词的下一个出现位置 但如果它是一个标签或结束标签 则最好不要搜索 在下面的示例中 是光标所在的位置 使用 or 与 iskeyword 不包括 gt or lt 将在之间移动
  • 数据库表设计

    我在选择数据库表的变量类型时遇到问题 有人可以给我一些关于如何选择类型的一般准则吗 以下是我的一些问题 用户 ID 应该是什么 INT 看起来很小 因为设计时应该考虑到大量用户 那么如果不是 INT 还有什么呢 大整数 VARCHAR 难道
  • 如何以一种形式发布两个或多个模型?

    我正在为一个项目开发互联网课程计划应用程序 该课程计划是根据以下模型构建的 使用数据库优先方法中的实体框架生成 public partial class Subject public int Id get set public string
  • 如何防止 this.debug is not a function 导致编译器退出

    参考这里提出的问题this debug 不是 Angular 通用函数 https stackoverflow com questions 65966642 this debug is not a function angular univ
  • 屏蔽字符串

    我需要将收到的字符串放入以下格式 在打字稿 javascript中 Eg 12 34 56 789 我知道有string mask以及通过 JQuery 的某种方式 有没有更简单的方法来做到这一点 您可以用所需的数据替换每个模式部分 fun
  • 如何迭代所有注册表项?

    我正在尝试迭代所有注册表项以查找 包含 并删除 jre1 5 0 14 值 有办法做到吗 下面的代码只是在特定键下找到jre1 5 0 14 我确实想迭代所有的键 顺便说一句 if 子句获取是否等于 jre1 5 0 14 但如果它包含 j
  • 如何将数据从 Parse.com 迁移到 Firebase

    我有两个当前正在使用 Parse com 的生产应用程序 我没有计划使用 Parse 服务器 我想切换到 firebase 服务 我想知道是否有办法将我的数据库从 Parse com 迁移到 Firebase Parse 和 Firebas
  • 保留字符串中的所有反斜杠

    我有一个包含反斜杠的字符串 time 4 4 key c major d 4 当我尝试将其传递到 nodejs child process 或只是将其传递到 console log 时 反斜杠被删除 console log time 4 4
  • 是否存在可处理 PRC/.mobi 文件的 PHP 库?

    我正在写一个WordPress 插件 http github com chrisclarke eBook Export Plugin for WordPress以大多数主要电子书格式从选定类别创建电子书 我想支持 MobiPocket 因为
  • Labview按钮按下一次后冻结

    我正在尝试编写一些程序来从 Labview ULx 库读取电压并将电压添加到数组中 我尝试使用事件结构来执行此操作 同时将布尔按钮的机械操作设置为 按下时锁定 然而 按下时锁定 选项似乎不起作用 程序读取电压并将其正确添加到阵列中 然后冻结
  • maven 编译失败,因为我有一个非 maven jar

    我有几个内部库 我还没有 不知道如何添加到我的本地 Maven 存储库中 我已将它们添加到项目的类路径中 但我的 maven compile 失败 指出它无法在外部 jar 中找到类 如预期 ERROR Failed to execute
  • 覆盖 Web 浏览器控件上的 window.location

    这似乎是一个奇怪的问题 但是有没有办法覆盖 window location 而不使浏览器控件导航到它 我遇到的问题是我在控件中注入 html 代码 而 window location 是 about blank 导致某些 javascrip
  • PHP 中给定日期的下一个工作日

    有人有一个 PHP 代码片段来计算给定日期的下一个工作日吗 例如 需要如何转换 YYYY MM DD 才能找到下一个工作日 例子 对于 03 04 2011 DD MM YYYY 下一个工作日是 04 04 2011 对于 2011 年 4
  • ResNet34 在 Keras.application 中可用吗?

    我想包装一个 keras ResNet34 模型 但似乎只有 ResNet50 可以从 keras applications 导入 有没有一种方法可以直接导入 ResNet34 而不用构建 ResNet34 我在网上找到了以下代码 但我想知
  • 加密数据库字段的好方法?

    我被要求加密数据库中的各种数据库字段 问题是这些字段在读取后需要解密 我在用着Django and SQL Server 2005 有什么好主意吗 See 在 SQL Server 2005 数据库中使用对称加密 https web arc
  • 如何将光标样式更改为悬停在图表点上的指针?

    我正在使用 Chart js v 2 库 当用户将鼠标悬停在图表点上时 我试图将光标样式更改为 指针 我将把它与条形图 饼图 折线图一起使用 看来charts js v 2 中应该支持这个选项 但我在任何地方都找不到例子 编辑 我没有提到我
  • 如何在自定义组件中使用 Vue.js 插件?

    我需要输出一个表格及其内容 可以通过 Ajax 进行更新 所以我打算使用vue tables 2 https github com matfish2 vue tables 2 https github com matfish2 vue ta
  • Qt - 如何使用 QNetworkAccessmanager 获取响应文本

    这是我的代码 Widget Widget manager new QNetworkAccessManager this connect manager SIGNAL finished QNetworkReply this SLOT repl
  • 有没有办法在 Blazor 中进行外部身份验证而不使用数据库?

    所以本质上我有一个 Blazor 服务器端应用程序 我正在尝试使用 Azure AD SAML 添加外部身份验证 我在用Sustainsys Saml2 AspNetCore2用于外部身份验证的包 我不太熟悉 ASP NET 或 Blazo
  • 只有根级导航目的地对于具有同质路径的导航堆栈有效

    我正在尝试整合NavigationStack在我的 SwiftUI 应用程序中 我有四个看法 CealUIApp OnBoardingView UserTypeView and RegisterView 我想从OnBoardingView