Perform push segue after an unwind segue Perform push segue after an unwind segue ios ios

Perform push segue after an unwind segue


A bit late to the party but I found a way to do this without using state flags

Note: this only works with iOS 9+, as only custom segues support class names prior to iOS9 and you cannot declare an exit segue as a custom segue in storyboards

1. Subclass UIStoryboardSegue with UIStoryboardSegueWithCompletion

class UIStoryboardSegueWithCompletion: UIStoryboardSegue {    var completion: (() -> Void)?    override func perform() {        super.perform()        if let completion = completion {            completion()        }    }}

2. Set UIStoryBoardSegueWithCompletion as the class for your exit segue

note: the action for this segue should be unwindToMainMenu to match the original question

Select exit segue from storyboardAdd custom class

3. Update your unwind @IBAction to execute the code in the completion handler

@IBAction func unwindToMainMenu(segue: UIStoryboardSegue) {    if let segue = segue as? UIStoryboardSegueWithCompletion {        segue.completion = {             self.performSegueWithIdentifier("Categories", sender: self)         }    }}

Your code will now execute after the exit segue completes its transition


I want to provide my own solution to this problem for now. Any further answers are always welcome.

I put a boolean variable and viewDidAppear function to MainPageViewController.

var fromCamera = falseoverride func viewDidAppear(animated: Bool) {    if fromCamera {        self.performSegueWithIdentifier("categorySelection", sender: self)        self.fromCamera = false    }}

I set fromCamera to true before I perform unwind segue from CropViewController. By that way, I perform segue to category screen only if an unwind segue from crop view is performed.


Taking forward this answer (I only had Objective-C code)

Subclass UIStoryBoardSegue

#import <UIKit/UIKit.h>@interface MyStoryboardSegue : UIStoryboardSegue/** This block is called after completion of animations scheduled by @p self. */@property (nonatomic, copy) void(^completion)();@end

And call this completion block after completion of animations.

@implementation MyStoryboardSegue- (void)perform {  [super perform];  if (self.completion != nil) {    [self.destinationViewController.transitionCoordinator     animateAlongsideTransition:nil     completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {       if (![context isCancelled]) {         self.completion();       }     }];  }}@end