麦哲伦 (Magellan)

Build Status

Nabigeta 提供简单的 API 来声明导航路线。与 trait 环境兼容。

为什么 (Why)

传统的应用程序导航将视图控制器紧密联系在一起,在需要时难以更改工作流程。

麦哲伦通过定义一个简单的路由系统来抽象视图控制器的使用,从而帮助您更容易地引入更改、深度链接、标签等等...

用法 (Usage)

1 - 使用枚举声明您的路由

enum AppRoutes {
  case book(Book)
  case cart(Cart)
}

2 - 声明您的路由处理程序

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())
  }
}

3 - 创建您的导航

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
  var navigation: Navigation! = nil

  func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    navigation = Navigation(router: route(for::))
  }
}

4 - 使用它!

class ViewController {
  var cart: Cart!

  func onCartTapped() {
      navigate(to: .cart(cart))
  }
}

高级用法 (Advanced Usage)

呈现 (Presentation)

麦哲伦提供了一些默认的呈现策略

如果它们都不能满足您的需求,您可以创建一个类/结构体,实现 PresentationStrategy 协议来提供您自己的自定义呈现方式。

停止导航 (Stopping navigation)

返回导航 (Navigate back)

您可以从源控制器取消导航

  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")
      }
    }