iosxcodeswiftunwind-segue

Perform push segue after an unwind segue


I am working on a camera app where the camera views are shown modally. After I am done with cropping. I perform an unwind segue to the MainPageViewController. (Please see the screenshot)

storyboard

My unwind function inside MainPageViewController is as follows;

@IBAction func unwindToMainMenu(segue: UIStoryboardSegue) {
    self.performSegueWithIdentifier("Categories", sender: self)
}

where "categories" is the push segue identifier from MainPageViewController to CategoriesTableViewController.

The program enters the unwindToMainMenu function but it does not perform the push segue. Any idea how to fix this?

Note: I found the same question but the answer suggests to change the storyboard structure.


Solution

  • 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 storyboard Add 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