Voyager

SwiftUI 中用于导航和路由的轻量级框架

Voyager

Voyager 使开发者能够使用路由来增强基于 SwiftUI 的应用程序,路由不仅适用于导航,还适用于选项卡。

安装

在 Xcode 中,通过File > Add Packages > Search or Enter Package URL 添加依赖项到您的项目,并使用以下 URL

https://github.com/bryan-vh/Voyager.git

添加后,在您的代码中导入该包

import Voyager

用法

路由

enum ExampleRoute: Route {
  case route1
  case route2
  case route3(String)
  case route4(Int)
}

首先,创建一个枚举来表示您的路由集合。 这些可以通过使用带有关联值的 Swift 枚举来进行参数化。

BaseVoyagerView

@StateObject var router = Router<ExampleRoute>(root: .route1)

BaseVoyagerView(router: router) { route in
  switch route {
  case route1: Route1View()
  case route2: Route2View()
  // ...
  }
}

所有 Voyager 视图中最简单的。 当您不需要导航或选项卡时使用。 如果您确实需要导航或选项卡,请使用下面对应的 Voyager 视图。

NavVoyagerView

@StateObject var router = Router<ExampleRoute>(root: .route1)

NavVoyagerView(router: router) { route in
  switch route {
  case route1: Route1View()
  case route2: Route2View()
  // ...
  }
}

NavVoyagerView 在底层使用 NavigationStack,因此您可以在子视图中根据需要使用 NavigationLink 视图。

TabVoyagerView

@StateObject var router = TabRouter<ExampleRoute>(tabs: [.route1, .route2], selected: .route1)

TabVoyagerView(router: router) { route in
  switch route {
  case route1: Route1View()
  case route2: Route2View()
  // ...
  }
} tabItem: { route in
  // Design a label for your tab item
}

TabVoyagerView 在底层使用一个带有 NavVoyagerView 数组的 TabView,因此导航可以为每个选项卡单独工作。

路由器 (Router)

struct Route1View: View {

  @EnvironmentObject var router: Router<ExampleRoute>

  // You can then use the router to push, pop, present modals, or dismiss as needed.
}

您可以在父 Voyager 视图的任何子视图中访问路由器。

DeeplinkHandler

final class ExampleDeeplinkHandler: DeeplinkHandler<ExampleRoute> {

  override func handleDeeplink(url: URL) -> (ExampleRoute, PresentationOption)? {
    // Transform the deeplink into a route with a given presentation option.
  }
}

通过将特定于路由的 DeeplinkHandler 注入到 Router 中,您将能够处理任何将从该路由器呈现某些路由的深层链接。

许可证

MIT 许可证