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
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