The SeguePerformer class provides an interface for initiating UIKit segues programatically, using closures for view controller preparation.
In UIKit's existing programmatic segue presentation interface,
UIViewController's performSegue(withIdentifier:sender:)
method relies on a
non-local definition of prepare(for:sender:)
to configure the new view
controller before it is presented. This can become unweildy in the context
of multiple performSegue
calls.
SeguePerformer improves upon this by providing a
performSegue(withIdentifier:sender:preparationHandler:)
method which allows for
configuration of the new view controller via a trailing closure parameter.
To install SeguePerformer using CocoaPods, add the following to your Podfile:
pod 'SeguePerformer'
Or, if you prefer, drag SeguePerformer.swift
into your project.
- Add a lazy
seguePerformer
property to your view controller. - Call
seguePerformer.performSegue(withIdentifier:sender:preparationHandler:)
to initiate segues whose destination view controllers require configuration. - Override your view controller's
prepare(for:sender:)
method, passing its parameters along toseguePerformer.prepare(for:sender:)
. Without this step, thepreparationHandler
closure will never be called.
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.
}
}
Without SeguePerformer, the traditional way of writing this would be:
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
}
}
}