With SegueManager
it's easy to programatically perform segues and update the destination view controller.
The following example demonstrates how to perform a segue and set a view model:
segueManager.performSegue(withIdentifier: "showDetails") { (details: DetailsViewController) in
details.viewModel = DetailsViewModel("This is the details view model")
}
See the full iOS example, or read below for usage instructions.
A major design goal of SegueManager 2.0 is to allow completely statically typed segues using R.swift
.
With R.swift the above example becomes:
self.performSegue(withIdentifier: R.segue.masterViewController.showDetails) { segue in
segue.destination.viewModel = DetailsViewModel("This is the details view model")
}
Here the segue
parameter is of type: TypedStoryboardSegueInfo<UIStoryboardSegue, MasterViewController, DetailViewController>
, which means the .destination
field is of the correct type.
To use R.swift together with SegueManager, include this subspec to your Podfile:
pod 'SegueManager/R.swift'
SegueManager is available for both iOS and OS X. Using CocoaPods, SegueManager can be integrated into your Xcode project by specifying it in your Podfile
:
pod 'SegueManager'
Then, run the following command:
$ pod install
There are two methods of using SegueManager:
-
Inherit from one of the base types:
SegueManagerViewController
,SegueManagerTableViewController
,SegueManagerCollectionViewController
, etc. -
Or, if you don't want to rely on inheritance (often problematic), create a SegueManager yourself:
-
On your ViewController, create a
SegueManager
, instantiated withself
. -
Implement the
SeguePerformer
protocol -
Override
prepare(for:)
and call SegueManager.
import SegueManager
class MasterViewController: UIViewController, SeguePerformer {
lazy var segueManager: SegueManager = {
// SegueManager based on the current view controller
return SegueManager(viewController: self)
}()
override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) {
segueManager.prepare(for: segue)
}
}
After this setup, simply call performSegue
on self and pass it a handler.
Call performSegue(withIdentifier)
with a string identifier and pass a handler. Make sure you specify the type of the destination ViewController, since that can not be inferred:
self.performSegue(withIdentifier: "showDetails") { (details: DetailsViewController) in
details.viewModel = DetailsViewModel("This is the details view model")
}
Call performSegue(withIdentifier)
with a segue identifier from R.segue.*
and pass a handler.
self.performSegue(withIdentifier: R.segue.masterViewController.showDetails) { segue in
segue.destination.viewModel = DetailsViewModel("This is the details view model")
}
The handler will be called after the destination view controller has been instantiated, but before its view has been loaded or any animations start.
- 5.0.0 - 2021-03-05 - Bump minimum version to iOS 9
- 4.2.0 - 2019-08-28 - Swift 5.1 support
- 4.1.0 - 2019-06-10 - Untested Carthage support
- 4.0.0 - 2018-05-19 - Swift 4.1 support
- 3.1.0 - 2017-01-05 - Add tvOS support
- 3.0.0 - 2016-09-13 - Swift 3 support
- 2.1.0 - 2016-03-22 - Swift 2.2 support
- 2.0.0 - 2016-02-10 - R.swift improvements
- 1.3.0 - 2016-01-23 - Add
SegueManagerViewController
asUIViewController
subclass - 1.2.0 - 2016-01-15 - Add R.swift support
- 1.1.0 - 2015-09-22 - Added Carthage support
- 1.0.0 - 2015-09-11 - Swift 2 support
- 0.9.1 - 2015-08-13 - Support for nested
UINavigationController
in destination - 0.9.0 - 2015-03-20 - Print warning when forgot to call perpareForSegue
- 0.5.0 - 2015-03-05 - Initial public release
- 0.0.0 - 2014-10-12 - Initial private version for project at Q42
SegueManager is written by Tom Lokhorst of Q42 and available under the MIT license, so feel free to use it in commercial and non-commercial projects.