Segues in Xcode

Creating segues in Xcode is very simple. Both - using Storyboards or just programmatically. Apple provides unwinding segues and usually there is no need to implement it.

But sometimes there are special cases in mobile app development, when you want to dismiss the current view and get back to the previous UIViewController. In MVC, we normally use the following function:

dismiss(animated flag: Bool, completion: (() -> Void)? = nil)

There is also an option to unwind on UINavigationController.

Uwinding segues in VIPER

Using VIPER is a little bit different. Mostly because communication between Controllers in VIPER should happen in Router. And Router isn’t UIViewController, so it doesn’t have automatic access to the stack with the current Controller.

What does it mean for Swift developers? Before performing an unwind we should „tell” our Router what is the initial Controller, so that Router will know to what view it should roll back.

We can do this in very simple way. First, we must create a handler in RouterInput:

var handler: UIViewController? { get set }

To this handle, we pass information about initial UIViewController. So in Configuraton, inside function configure(viewController: UIViewController) we add these lines:

router.handler = viewController

Next, in Router class we create a function called for example dismissModular(). It looks like this:

    func dismissModular() {
        handler?.navigationController?.popViewController(animated: false)

As you can see, handler is passed within this function, so it can be easily implemented in Presenter. Because now Router „knows” what UIViewController is initial.

Wrapping up

That’s all, have fun. If you have any questions or corrections, please feel free to add them in comments section. If you're not familiar with design pattern VIPER, check out my last blog post on this subject.

Picture by Freestocks on

Recommended reads