Ame*_*079 2 ios swift swiftui swiftui-navigationstack swiftui-navigationpath
我正在尝试使用 NavigationStack 为我的 SwiftUI 项目进行导航。我总共有 4 个屏幕。我的应用程序的主页有登录和注册按钮。如果用户成功登录,应用程序会将用户带到主页,用户可以在其中执行与应用程序相关的其他操作。注册按钮将他们导航到注册页面。如果他们成功注册,他们将导航到应用程序的主页,在那里他们可以继续使用应用程序。
\n在主屏幕上,我有一个带有按钮的工具栏,可将用户导航到另一个页面,在其中他们可以看到从远程数据库检索到的项目列表。
\n我正在使用 NavigationStack 和 NavigationPath 进行导航。我正在设置附加到导航路径的字符串值。
\n但是,当我使用字符串值将用户从主屏幕导航到列表屏幕时,出现以下错误:
\n\xe2\x80\x9cswift.string\xe2\x80\x9d 的导航目标已在堆栈的较早位置声明。仅使用最接近堆栈根视图声明的目标。
\n我尝试了几个小时来解决这个问题,但我无法做到。有人可以让我知道我哪里出了问题吗?我的代码如下:
\nstruct MainScreen: View {\n @State private var path: NavigationPath = NavigationPath()\n \n var body: some View {\n /*\n Other code here\n */\n \n Button { \n print("Show Sign Up View")\n path.append("ShowSignUp") \n } label: {\n HStack {\n // Image(systemName: "person.fill.badge.plus")\n Text("Sign Up") \n } \n }\n .navigationDestination(for: String.self) { value in \n if(value == "ShowAddParking") {\n AddParkingView(path: $path)\n } else if(value == "ShowSignUp") {\n SignUpView(path: $path)\n } \n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n注册屏幕:
\nstruct SignUpView: View {\n @Binding var path: NavigationPath\n \n var body: some View {\n \n /*\n Other Code here\n */\n \n Button("Register") {\n //I had to use an Int here since I was getting the same error \n self.path.append(1)\n }\n .navigationDestination(for: Int.self) { value in\n if value == 1{\n AddParkingView(path: self.$path)\n } \n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n应用程序的主屏幕:
\nstruct AddParkingView: View { \n @Binding var path: NavigationPath\n \n var body: some View { \n //code for this View\n \n .toolbar { \n ToolbarItem(placement: .navigationBarTrailing) {\n Button("View Parking") {\n print("Show Parking Items")\n self.path.append("ParkingList") \n } \n }\n }\n .navigationDestination(for: String.self) { _ in\n ParkingListView(path: self.$path)\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n有人可以给我一些建议吗?谢谢。
\n小智 8
该navigationDestination修改器适用于导航堆栈的整个层次结构,而不仅仅是它所在的单个视图。如果您要将.navigationDestination(for: Int.self) {...修改器从SignUpView移至 ,MainScreen您应该会发现导航仍然有效,即使它没有直接应用于调用它的视图。
考虑到这一点,您的两个.navigationDestination(for: String.self) {...修饰符正在竞争进入导航路径的所有字符串。两个修饰符都想读取该值,这就是 Xcode 警告想要表达的内容。
一个简单的解决方案是将根处的两个修饰符组合起来,如下所示:
.navigationDestination(for: String.self) { value in
if(value == "ShowAddParking") {
AddParkingView(path: $path)
} else if(value == "ShowSignUp") {
SignUpView(path: $path)
} else {
ParkingListView(path: self.$path)
}
}
Run Code Online (Sandbox Code Playgroud)
为了简单起见,您可能希望将所有navigationDestination修改器放置在与导航路径相同的视图中,因为导航工作无论如何都发生在同一视图中。
| 归档时间: |
|
| 查看次数: |
2608 次 |
| 最近记录: |