SegueCoordinator
Application Coordinator 模式的替代方案。创建独立的类来处理导航,而不是视图控制器。
从视图控制器中移除导航。
控制器不再需要互相了解。如果控制器需要在另一个控制器中显示一些数据,它调用一个闭包并将数据传递给它。SegueCoordinator 处理这个闭包,显示所需的控制器并将数据填充到其中。
将应用程序分解成部分。
您可以为不同的业务流程创建多个协调器并重用它们。SegueCoordinator 可以成为这些流程的好入口点。
移除样板代码。提高可读性。
SegueCoordinator 允许您以紧凑和一致的方式执行典型的导航任务,如 推送、过渡、模态。
需求
- iOS 9+
- Swift 5
- XCode 10.2+
安装
SegueCoordinator 可通过 CocoaPods 获得。要安装它,只需将以下行添加到您的 Podfile 中
pod 'SegueCoordinator'
使用
1. 准备控制器
使用 Main.storyboard 创建初始的 ListViewController 和 DetailsViewController。从列表视图控制器到详情视图控制器添加一个 segue,标识符为 "ShowDetails"。
class ListViewController: UIViewController {
var onShowDetails: ((String)->Void)?
func showDetails() {
onShowDetails?("Data")
}
}
class DetailsViewController: UIViewController {
var details: String!
override func viewDidLoad() {
super.viewDidLoad()
// show details text here
}
}
重要
如果您重写了 prepareForSegue 方法,务必调用 super.prepareForSegue
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
}
2. 创建协调器
import SegueCoordinator
class MainCoordinator: SegueCoordinator {
init(rootNavigationController: UINavigationController) {
super.init(storyboardName: "Main", rootNavigationController: rootNavigationController)
}
func start() {
setInitial(type: ListViewController.self) {
$0.onShowDetails = { [unowned self] in self.showDetails($0) }
}
}
func showDetails(_ details: String) {
segue("ShowDetails", type: DetailsViewController.self) {
$0.details = details
}
}
}
3. 配置 AppDelegate
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
private var mainCoordinator: MainCoordinator?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let rootNavigationController = UINavigationController()
window?.rootViewController = rootNavigationController
window?.makeKeyAndVisible()
mainCoordinator = MainCoordinator(rootNavigationController: rootNavigationController)
mainCoordinator?.start()
return true
}
}
完整的API参考
https://npu3pak.github.io/ios-lib-segue-coordinator/Classes/SegueCoordinator.html
示例
要运行示例项目,请克隆仓库,然后从示例目录中运行pod install
。
作者
Evgeniy Safronov,[email protected]
许可协议
SegueCoordinator遵循MIT许可协议。有关更多信息,请参阅LICENSE文件。