📱 📲
CoreNavigation轻松在视图控制器之间导航。
入门
以下说明将帮助您将 CoreNavigation 集成到项目中。
先决条件
- Xcode 9 或更高版本
- iOS 8 或更高版本
- Cocoapods
安装
果壳Pods
果壳Pods是一个Cocoa项目的依赖管理器。您可以使用以下命令安装它:
$ gem install cocoapods
需要1.1及以上的果壳Pods版本来构建CoreNavigation 1.0及以上版本。
要使用果壳Pods将CoreNavigation集成到您的Xcode项目中,请在Podfile中指定它:
target '<Your Target Name>' do
use_frameworks!
pod 'CoreNavigation', '1.0.0-beta-4'
end
然后,运行以下命令:
$ pod install
Carthage
Carthage是一个去中心化的依赖管理器,它构建您的依赖并提供二进制框架。
您可以使用Homebrew安装Carthage,使用以下命令:
$ brew update
$ brew install carthage
要使用Carthage将CoreNavigation集成到您的Xcode项目中,请在Cartfile中指定它:
github "aronbalog/CoreNavigation" == "1.0.0-beta-4"
API参考
API参考
示例用法
定义视图控制器
class PersonProfileViewController: UIViewController, DataReceivable {
// DataReceivable associatedtype
typealias DataType = Person
func didReceiveData(_ data: Person) {
// configure UI with data
}
}
展示视图控制器
Navigate.present { $0
.to(PersonProfileViewController())
.withData(person)
}
推送视图控制器
Navigate.push { $0
.to(PersonProfileViewController())
.withData(person)
}
路由 & 深度链接
为什么使用 目标
而不是直接导航到视图控制器?
在 Medium 上了解详情
目标
定义
struct PersonProfile: Destination, Routable {
// Destination associatedtype
typealias ViewControllerType = PersonProfileViewController
// Routable patterns
static var patterns: [String] = [
"https://myapp.com/person/:personId(.*)",
"https://myapp.com/user/:personId(.*)"
]
let personId: String
init(_ personId: String) {
self.personId = personId
}
var parameters: [String : Any]? {
return [
"personId": personId
]
}
static func resolve(context: Context<PersonProfile>) {
guard let personId = context.parameters?["personId"] as? String else {
// cancel navigation with some error
context.cancel(error: NavigationError.Destination.notFound)
return
}
// fetch person
fetchPerson(id: personId, completion: { (person: Person) in
// continue to navigation
context.complete(data: person)
}, failure: { (error: Error) in
// cancel navigation with some error
context.cancel(error: error)
})
}
}
可路由
类型
注册 为了使用 可匹配
类型(String
、URL
等)进行导航,必须将每个 目标
类型进行注册。把它想象成内部 DNS。
PersonProfile.register()
附加语法
Navigate.router.register(routableType: PersonProfile.self)
目标
类型可以不遵守 可路由
协议而进行路由。如果您打算创建某种类型的目标清单或从外部源获取路由模式,请使用此方法。
Navigate.router.register(destinationType: PersonProfile.self, patterns: [
"https://myapp.com/person/:personId(.*)",
"https://myapp.com/user/:personId(.*)"
])
附加语法
PersonProfile.self <- [
"https://myapp.com/person/:personId(.*)",
"https://myapp.com/user/:personId(.*)"
]
Settings.self <- [
"https://myapp.com/settings"
]
目的地
进行导航
使用// present
Navigate.present { $0
.to(PersonProfile("sherlock_holmes"))
...
}
// or push
Navigate.push { $0
.to(PersonProfile("sherlock_holmes"))
...
}
附加语法
// present
PersonProfile("sherlock_holmes").present { $0
...
}
// or push
PersonProfile("sherlock_holmes").push { $0
...
}
附加语法
// present
PersonProfile("sherlock_holmes").present()
// or push
PersonProfile("sherlock_holmes").push()
使用路由进行导航
// present
Navigate.present { $0
.to("https://myapp.com/person/sherlock_holmes")
...
}
// or push
Navigate.push { $0
.to("https://myapp.com/person/sherlock_holmes")
...
}
附加语法
// present
"https://myapp.com/person/sherlock_holmes".present { $0
...
}
// or push
"https://myapp.com/person/sherlock_holmes".push { $0
...
}
附加语法
// present
"https://myapp.com/person/sherlock_holmes".present()
// or push
"https://myapp.com/person/sherlock_holmes".push()
目的地
异步获取视图控制器
使用PersonProfile("sherlock_holmes").viewController { (viewController) in
// vc is `PersonProfileViewController`
}
使用路由异步获取视图控制器
"https://myapp.com/person/sherlock_holmes".viewController { (viewController) in
...
}
目的地
同步获取视图控制器
使用
do {
let viewController = try PersonProfile("sherlock_holmes").viewController()
} catch let error {
// handle error
}
使用路由同步获取视图控制器
do {
let viewController = try "https://myapp.com/person/sherlock_holmes".viewController()
} catch let error {
// handle error
}
注意
如果您实现自定义目的地解析,必须在主线程中进行;否则,将抛出错误。
可匹配协议
URL
类型也可以用于导航或解析视图控制器。实际上,任何符合可匹配
协议的类型都可以使用。
符合可匹配
struct Person {
let id: String
...
}
extension Person: Matchable {
var uri: String {
return "https://myapp.com/person/" + id
}
}
示例用法
let person: Person = Person(id: "sherlock_holmes", ...)
// getting view controller
let personProfileViewController = try! person.viewController
// or navigating
person.present()
person.push()
// or more configurable syntax
Navigate.present { $0
.to(person)
...
}
配置
示例应用
运行测试
在 核心导航测试
目标中可用。
版本控制
当前版本
- 1.0.0-beta-4
作者
贡献
请阅读贡献了解行为守则以及提交拉取请求的流程。
许可
本项目遵循MIT许可协议 - 请参见LICENSE文件以获取详细信息。