SwiftUI 导航Stack 导航

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

我尝试了几个小时来解决这个问题,但我无法做到。有人可以让我知道我哪里出了问题吗?我的代码如下:

\n
struct 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}\n
Run Code Online (Sandbox Code Playgroud)\n

注册屏幕:

\n
struct 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}\n
Run Code Online (Sandbox Code Playgroud)\n

应用程序的主屏幕:

\n
struct 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}\n
Run 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修改器放置在与导航路径相同的视图中,因为导航工作无论如何都发生在同一视图中。