URLNavigator 使用

URLNavigator 框架

⛵️ URLNavigator 是 Swift 下一个优雅的 URL 路由。它提供了通过 URL 导航到 view controller 的方式。URL 参数的对应关系通过 URLNavigator.register(_:_:) 方法进行设置。

URLNavigator 提供了两种方法来设置 URL 参数的对应关系:URLNavigable 和 URLOpenHandler。URLNavigable 通过自定义的初始化方法进行设置,URLOpenHandler 通过一个可执行的闭包进行设置。初始化方法和闭包都接受一个 URL占位符值。

开始

1. 理解 URL 模式

URL 模式可以包含多个占位符。占位符将会被匹配的 URL 中的值替换。使用 <> 来设置占位符。占位符的类型可以设置为:string(默认), int, float, 和 path

例如,myapp://user/<int:id> 将会和下面的 URL 匹配:

  • myapp://user/123
  • myapp://user/87

但是,无法和下面的 URL 配置:

  • myapp://user/devxoul (类型错误,需要 int)
  • myapp://user/123/posts (url 的结构不匹配))
  • /user/devxoul (丢失 scheme)

2. View Controllers 和 URL 打开操作的匹配

URLNavigator 通过 URL 模式来匹配 view controllers 和 URL 的打开操作。下面是使用 view controller 和闭包映射 URL 模式的示例。每个闭包有三个参数:url, valuescontext

  • url 是通过 push() 或者 present() 传递的 URL 参数.
  • values 是一个包含 URL 占位符的 keysvalues 的字典.
  • context 是通过 push(), present()open() 传递的额外值的字典。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let navigator = Navigator()

// register view controllers
navigator.register("myapp://user/<int:id>") { url, values, context in
guard let userID = values["id"] as? Int else { return nil }
return UserViewController(userID: userID)
}
navigator.register("myapp://post/<title>") { url, values, context in
return storyboard.instantiateViewController(withIdentifier: "PostViewController")
}

// register url open handlers
navigator.handle("myapp://alert") { url, values, context in
let title = url.queryParameters["title"]
let message = url.queryParameters["message"]
presentAlertController(title: title, message: message)
return true
}

3. 弹出方式(Pushing, Presenting)与操作 URLs

URLNavigator 可以通过执行一个带 URLs 参数的闭包来 push 或者 presenet 对应的 view controllers。

push() 方法中,通过指定 from 参数可以设置弹出新 view controllernavigation controller。同样,在 present() 方法中,通过指定 from 参数可以设置弹出新 view controllerview controller。如果设置为 nil,也就是默认值,当前应用程序最顶层的 view controller 将会被用来 pushpresent 新的 view controller

present() 还有一个额外的参数 wrap。如果将这个参数设置为 UINavigationController 类型,则会用这种类型的导航控制器把要弹出的新的 view controller 包住。这个参数的默认值为 nil

1
2
3
4
Navigator.push("myapp://user/123")
Navigator.present("myapp://post/54321", wrap: UINavigationController.self)

Navigator.open("myapp://alert?title=Hello&message=World")


-------------The End-------------

本文标题:URLNavigator 使用

文章作者:kysonyangs

发布时间:2019年08月11日 - 15:08

最后更新:2020年06月08日 - 10:06

原始链接:https://kysonyangs.github.io/default/URLNavigator使用/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。