SeguePerformer
概述
SeguePerformer 类提供了使用闭包来准备视图控制器的方法,用于通过编程方式启动 UIKit 的转场。
背景
在 UIKit 现有的程序化转场展示接口中,UIViewController 的 performSegueWithIdentifier:sender:
方法依赖于对 prepareForSegue:sender:
的非局部定义来配置在展示之前的新视图控制器。这在执行多个 performSegue
调用的上下文中可能会变得难以管理。
SeguePerformer 通过提供 performSegueWithIdentifier:sender:preparationHandler:
方法来改进这一点,该方法允许通过跟踪闭包参数来配置新的视图控制器。
安装
要使用 CocoaPods 安装 SeguePerformer,请将以下行添加到 Podfile 中
pod 'SeguePerformer'
要使用 Carthage 安装,添加以下内容到 Cartfile
github "drewolbrich/SeguePerformer"
或者,如果您愿意,可以将文件 SeguePerformer.swift
拖入您的项目中。
使用方法
- 向你的视图控制器添加一个懒加载的
seguePerformer
属性。 - 调用
seguePerformer.performSegue(withIdentifier:sender:preparationHandler:)
来启动目标视图控制器需要配置的转换。 - 重写你视图控制器中的
prepare(for:sender:)
方法,将参数传递给seguePerformer.prepare(for:sender:)
。如果不执行此步骤,preparationHandler
代码块将永远不会被调用。
示例
import SeguePerformer
class MyPresentingViewController: UIViewController {
lazy var seguePerformer = SeguePerformer(viewController: self)
func performMySegue(with myPropertyValue: Int) {
// Perform the segue, configuring the destination view controller
// before it is presented.
seguePerformer.performSegue(withIdentifier: "mySegue", sender: self) {
(myPresentedViewController: MyPresentedViewController) in
myPresentedViewController.myProperty = myPropertyValue
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// For SeguePerformer.performSegue's trailing closure to be called,
// SeguePerformer must be notified about the prepare(for:sender:) call.
if seguePerformer.prepare(for: segue, sender: sender) {
return
}
// Prepare for interactive segues configured in Storyboard here.
}
}
没有 SeguePerformer,编写的方式如下所示:
class MyPresentingViewController: UIViewController {
var myPresentedViewControllerPropertyValue: Int?
func performMySegue(with myPropertyValue: Int) {
myPresentedViewControllerPropertyValue = myPropertyValue
performSegue(withIdentifier: "mySegue", sender: self)
// Continues in prepare(for:sender:)...
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let myPresentedViewController = segue.destination as? MyPresentedViewController,
let myPresentedViewControllerPropertyValue = myPresentedViewControllerPropertyValue {
// ...continued from performMySegue(with:)
myPresentedViewController.myProperty = myPresentedViewControllerPropertyValue
self.myPresentedViewControllerPropertyValue = nil
}
}
}
许可协议
此项目根据 MIT 开源许可协议。请参阅 LICENSE 文件以获取完整条款。