CoreNavigation 1.0.0-beta-5

CoreNavigation 1.0.0-beta-5

Aron Balog 维护。



CoreNavigation 1.0.0-beta-5

  • Aron Balog

CoreNavigation📱📲

轻松在视图控制器之间导航。💫

Platform Build Status Documentation codecov CocoaPods Compatible Carthage compatible

入门

以下说明将帮助您将 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)
        })
    }
}

注册 可路由 类型

为了使用 可匹配 类型(StringURL 等)进行导航,必须将每个 目标 类型进行注册。把它想象成内部 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文件以获取详细信息。