NGSRouter 1.0.1

NGSRouter 1.0.1

STT 维护。



NGSRouter 1.0.1

  • Peter Standret

NGSRouter

描述

NGSRouter 是一款轻量级的页面过渡库,使得页面之间的过渡变得简单,只需要几行代码即可。

安装

CocoaPods

添加到您的 podfile 中

pod "NGSRouter", "~> 1.0.0"

示例

关于 NGSRouter

NGSRouter 可与 Storyboard.xib 和基于代码的视图控制器一起工作。

对于导航,您可以使用基本的 NGSRouter 实现并选择更适合的功能。您可以更改过渡流程,自定义您的方式。

如何使用

例如,我们将完成两个页面之间的切换

import NGSRouter

// MARK: - The first view controller.

final class ViewController: UIViewController {

  // This property contain protocol protected view controller for transition.
  private lazy var router = NGSRouter(transitionHandler: self)

  @IBAction func onOpenPage(_ sender: UIButton) {
    router.navigate(
        to: DestinationViewController.self,
        typeNavigation: .push,
        animated: true
    )
  }
} 

// MARK: - The destination view controller.

final class DestinationViewController: UIViewController, NGSNavigatable { 
  func prepare() { 
    // configure page here. This function call by router before navigation
  }
} 

在这种情况下,您会创建视图控制器之间的默认过渡并自定义目标视图控制器。但在导航执行之前,您必须在系统中注册导航

// 1. Register storyboard id factory
NGSRouterConfig.shared.registerStoryboardIdFactory(factory: NGSViewControllerStoryboardIdFactory())
// 2. Register navigation
NGSRouterAssember.default.register(
  DestinationViewController.self,
  storyboard: Storyboard.main
)
/// and etc..

其中 Storyboard 是项目中实现 NGSStoryboard 的枚举。

注意❗️ 如果您使用 storyboard 导航,则您的 storyboardId 应遵循以下规则

基于视图控制器:从 className 中切出 ViewController className:DestinationViewController -> storyboardId Destination

基于演示者:从 className 中切出 Presenter className:DestinationPresenter -> storyboardId Destination

您还可以通过实现协议 NGSStoryboardIdFactory 来创建自己的 storyboardId 工厂。

过渡情况

例如,我们用不同类型的导航分析以下代码

  • 简单导航
  • 带参数的导航
  • 带关闭参数的导航
  • 结合使用

简单导航(NGSNavigatable)

这是默认情况,使用默认的 NGSRouter 实现。如果您只需要显示新页面,那么请使用它。

示例

在目标类中实现 NGSParamNavigatable

final class DestinationViewController: UIViewController, NGSNavigatable { 
  func prepare() { 
    // configure page here. This function call by router before navigation
  }
} 

进行导航

router.navigate(
  to: DestinationViewController.self,
  typeNavigation: .modal,
  animated: true
)

带参数的导航(NGSParamNavigatable)

有时在程序中,您需要将一些数据传递给下一个屏幕,但在默认实现中,它可能有点冗长。NGSRouter 提供了一种灵活的方式,让您以极短的方式完成此操作。

示例

在目标类中实现 NGSParamNavigatable

final class DestinationViewController: UIViewController, NGSParamNavigatable { 
  func prepare() { 
    // configure page here. This function call by router before navigation
  }

  func prepare(parameter: String) {
    // you receive parameter here. Pay attention that this function is called before navigation.
  }
} 

进行导航

_router.navigate(
    to: DestinationViewController.self,
    parameter: "Target text",
    typeNavigation: .modal,
    animated: true
)

带关闭参数的导航(NGSParamNavigatable)

有时在程序中,您需要将一些数据传递给上一个屏幕(例如,从输入视图控制器返回数据)。NGSRouter 提供了一种灵活的方式,让您以极短的方式完成此操作。

示例

在目标类中实现 NGSCloseNavigatable

final class DestinationViewController: UIViewController, NGSParamNavigatable { 
  func prepare() { 
    // configure page here. This function call by router before navigation
  }

  // Special object to return data to the previous screen. Set here appropriate type
  var closableObject = NGSCloseObject<String>()

  // close current
  func closeScreen(parameter: String) {
    _router.close(target: self, parameter: parameter, animated: true)
  }
} 

进行导航

_router.navigate(
    to: DestinationViewController.self,
    typeNavigation: .modal,
    animated: true,
    closeCompletion: { parameter in
      // you receive close parameter here
    }
)

结合使用

如果您需要传递参数并接收关闭参数,您应该在目标类中实现这两个协议或使用特殊的 typealias NGSParamCloseNavigatable

如果不需要为目标屏幕传递参数,但目标屏幕实现了特殊协议,则可以改用用于简单导航的功能,代替使用带有参数的导航功能。

自定义过渡

要自定义过渡,可以更改过渡演示并设置动画。

动画过渡

此参数可以动画化当前的过渡效果。在一个导航函数中将=animated设置为适当的值。

更改演示文稿

参数 typeNavigation 负责更改演示文稿样式。它与 UINavigationControllerUISplitViewControllerModalPresentation 和默认演示文稿一起工作。

  • 默认样式pushmodalcrossDisolveformSheet

📌支持的自定义样式

  • 导航样式pushpoppresent
    typeNavigation: .custom(.navigation(style: NavigationStyle))
  • 分割样式detaildefault
    typeNavigation: .custom(.split(style: SplitStyle))
  • 模态样式UIModalTransitionStyleUIModalPresentationStyle - 标准 UIKit 演示文稿样式。)
    typeNavigation: .custom(style: .modal(transition: UIModalTransitionStyle, presentation: UIModalPresentationStyle))

配置目标控制器

所有导航都需要在使用先前进行一次注册。您可以在 AppDelegate 或您的 CoordinatorAssembler 中执行此操作,这并不重要,但您必须在进行导航之前注册它,否则您将收到致命错误。

在 Storyboard 中注册有视图的视图控制器

NGSRouterAssember.default.register(
    DestinationViewController.self,
    storyboard: Storyboard.main
) { (vc: DestinationViewController) in
    // configure target vc if needed
}
  

通过 .xib 或代码注册视图控制器

 NGSRouterAssember.default.register(
    DestinationViewController.self,
    factory: { DestinationViewController() }
) { (vc: DestinationViewController) in
    // configure target vc if needed
}
  

如果不需要配置目标视图控制器,可以省略此参数。

注意

感谢观看。