Nabigeta 提供简单的 API 来声明导航路线。与 trait 环境兼容。
传统的应用程序导航将视图控制器紧密联系在一起,在需要时难以更改工作流程。
麦哲伦通过定义一个简单的路由系统来抽象视图控制器的使用,从而帮助您更容易地引入更改、深度链接、标签等等...
enum AppRoutes {
case book(Book)
case cart(Cart)
}
func route(for context: AppRoutes, _ sender: UIViewController?) -> Route? {
switch context {
case .book(let book):
return Route(BookViewController())
case .cart(let cart):
return Route(CartViewController()).present(PresentationModal())
}
}
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var navigation: Navigation! = nil
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
navigation = Navigation(router: route(for::))
}
}
class ViewController {
var cart: Cart!
func onCartTapped() {
navigate(to: .cart(cart))
}
}
麦哲伦提供了一些默认的呈现策略
如果它们都不能满足您的需求,您可以创建一个类/结构体,实现 PresentationStrategy
协议来提供您自己的自定义呈现方式。
您可以从源控制器取消导航
bookViewController.navigateBack() // come back to BookViewController
您也可以从目标控制器停止导航
cartViewController.navigationTerminated(status: .canceled) // dismiss CartViewController
您也可以在导航停止时收到通知
viewController
.navigate(to: .cart(self.cart))
.onTerminate { status in
if status == .canceled {
print("author controller cancelled")
}
}