AnnotationNavigator 0.0.1

AnnotationNavigator 0.0.1

SeanXu维护。



 
依赖项
Sourcery~> 0.14.0
URLNavigator~> 2.0.6
 

  • 作者
  • seanxu

AnnotationNavigator (自动化Router)

Swift

基于sourcery自动生成router定义和注册的代码。工程里已经加入了script脚本,添加注释后编译,就会自动生成router相关的代码

Router类型定义

// sourcery: router="sign"
// 签单第二步
class SignedBillViewController: ViewController {
}

Router参数定义

  • 单个参数的场合
// sourcery: parameter
public var url: String
  • 多个参数的场合
// sourcery:begin: parameter
var buildingId: Int?
var companyId: Int?
var companyName: String?
var companyAlias: String?
var kpId: Int?
var endOrder: Int?
var companyPhotos: [PhotoModel]?
var stationPhotos: [PhotoModel]?
// sourcery:end
  • 参数别名

URL中的参数可能是关键字或者super已声明字段,可以通过alias来为其创建别名(别名对应URL中的参数名字)

// sourcery: parameter, alias="title"
public var pageTitle: String?

Router页面跳转

  • 通过带有关联值的枚举直接进行跳转
navigator.push(.weex(pageTitle: "修改密码", url: "change_password", param: nil))
  • 构造Router进行跳转
Router("xxx://xxx.cn/web?url=xxxx")

Controller初始化

Controller默认通过无参数的初始化方法初始化。
如果自定义了带参数的初始化方法,需要按照以下步骤实现:

  • Controller需要实现InitRoutable协议
  • init方法的参数需要按照参数列表从上到下依次列出,确保顺序和名字一致
// sourcery: router="weex"
class WeexViewController: UIViewController, InitRoutable {
    // sourcery: parameter, alias="title"
    public var pageTitle: String?
    // sourcery: parameter
    public var url: String
    // sourcery: parameter
    
    init(pageTitle: String?, url: String, param: [String: Any]?) {
        self.pageTitle = pageTitle
        self.url = url
        self.param = param
        super.init(nibName: nil, bundle: nil)
    }
    ...
}

特殊情况处理

如果存在无法通过sourcery生成router的情况,比如Pods的页面,特殊参数类型等。

  • 在Router.swift里面编写一个假的控制来编写注释并实现CustomRoutable协议
  • 在URLNavigationMap.swift里面自己编写register
// sourcery: router="photoView", path="photo_view"
class RouterPhotoViewController: UIViewController, CustomRoutable {}

// 照片浏览
navigator.register(RouterType.photoView) { _, _, context in
    guard let router = context as? Router else {
        return nil
    }
    if let urls = router.context["urls"] as? [String],
        let currentIndex = router.context["currentIndex"] as? Int {
        let photoBrowser = SKPhotoBrowser(photos: urls.map { SKPhoto.photoWithImageURL($0) })
        photoBrowser.currentPageIndex = currentIndex
        photoBrowser.hidesBottomBarWhenPushed = true
        return photoBrowser
    }
    return nil
}