使用基于路径的路由,轻松维护 SwiftUI 应用的导航。
通过 SwiftUI Router,你可以使用基于路径的路由来驱动你的 SwiftUI 应用。通过利用基于路径的系统,你的应用中的导航将变得更灵活且更易于维护。
NavigationStack
。这提供了一个与 SwiftUI Router 类似的工作流程,并且是类型安全的。但是,两者之间存在一些关键差异。建议在你的项目中使用 SwiftUI Router 之前先试用 NavigationStack
。
在 Xcode 中,通过 *File > Add Packages > Search or Enter Package URL* 将依赖项添加到你的项目中,并使用以下 URL
https://github.com/frzi/SwiftUIRouter.git
添加完成后,在你的代码中导入该包
import SwiftUIRouter
万事俱备,只欠东风!
以下是可用视图和对象及其基本功能的快速概述。有关更多详细信息,请查看 Swift 文件中的文档。
Router {
RootView()
}
路由环境的入口。将你的整个应用(或仅需要路由的部分)包装在 Router
中。此视图将初始化路由所需的所有必要环境值。
Route("news/*") {
NewsScreen()
}
Route("settings") {
SettingsScreen()
}
Route("user/:id?") { info in
UserScreen(id: info.parameters["id"])
}
一个视图,只有当它的路径与环境的路径匹配时才会渲染它的内容。使用 /*
来匹配更深层的路径。例如:路径 news/*
将匹配以下环境路径:/news
、/news/latest
、/news/article/1
等。
路径可以包含参数(也称为占位符),这些参数可以单独读取。参数的名称以冒号 (:
) 为前缀。此外,可以通过在参数后面加上问号 (?
) 来将其视为可选参数。这些参数作为 [String : String]
传递到 RouteInformation
对象中的 Route
的内容中。
注意:参数只能由字母数字字符(A-Z、a-z 和 0-9)组成,并且必须以字母开头。
func validateUserID(routeInfo: RouteInformation) -> UUID? {
UUID(routeInfo.parameters["id"] ?? "")
}
Route("user/:id", validator: validateUserID) { userID in
UserScreen(userID: userID)
}
Route
提供了一个额外的步骤来验证路径中的参数。
假设你的 Route
的路径是 /user/:id
。默认情况下,:id
参数可以是任何东西。但在这种情况下,你只想使用有效的 UUID。使用 Route
的 validator
参数,你有机会验证(和转换)参数的值。
验证器是一个简单的函数,它接收一个 RouteInformation
对象(包含参数)并返回转换后的值作为可选值。新的转换后的值会传递给你的视图,而不是默认的 RouteInformation
对象。如果转换后的值为 nil
,则 Route
将阻止渲染其内容。
NavLink(to: "/news/latest") {
Text("Latest news")
}
Button
的一个包装器,如果按下按钮,它将导航到给定的路径。
SwitchRoutes {
Route("latest") {
LatestNewsScreen()
}
Route("article/:id") { info in
NewsArticleScreen(articleID: info.parameters["id"]!)
}
Route(":unknown") {
ErrorScreen()
}
Route {
NewsScreen()
}
}
一个视图,它只渲染第一个路径与环境路径匹配的 Route
。如果你希望使用回退,这将很有用。此视图可以稍微提高性能,因为它会阻止 Route
在先前的 Route
的路径已解决后进行路径匹配。
Navigate(to: "/error-404")
此视图将在渲染后自动导航到另一个路径。可以考虑在 SwitchRoutes
中的回退 Route
中使用此视图。
@EnvironmentObject var navigator: Navigator
一个包含 Router
数据的环境对象。使用此对象,你可以以编程方式导航到另一个路径、在历史堆栈中后退或前进。
@EnvironmentObject var routeInformation: RouteInformation
一个轻量级对象,包含当前 Route
的信息。 RouteInformation
包含相对路径和一个包含所有已解析参数的 [String : String]
。
默认情况下,此对象在 Route
中传递到其内容。它也可以作为环境对象访问。