SwiftUI 中用于导航和路由的轻量级框架
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 枚举来进行参数化。
@StateObject var router = Router<ExampleRoute>(root: .route1)
BaseVoyagerView(router: router) { route in
switch route {
case route1: Route1View()
case route2: Route2View()
// ...
}
}
所有 Voyager 视图中最简单的。 当您不需要导航或选项卡时使用。 如果您确实需要导航或选项卡,请使用下面对应的 Voyager 视图。
@StateObject var router = Router<ExampleRoute>(root: .route1)
NavVoyagerView(router: router) { route in
switch route {
case route1: Route1View()
case route2: Route2View()
// ...
}
}
NavVoyagerView 在底层使用 NavigationStack,因此您可以在子视图中根据需要使用 NavigationLink 视图。
@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,因此导航可以为每个选项卡单独工作。
struct Route1View: View {
@EnvironmentObject var router: Router<ExampleRoute>
// You can then use the router to push, pop, present modals, or dismiss as needed.
}
您可以在父 Voyager 视图的任何子视图中访问路由器。
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 中,您将能够处理任何将从该路由器呈现某些路由的深层链接。