FlowCastv
FlowCastv

Reputation: 147

Custom segue not working in iOS 9.1

I'm trying to create a custom segue. It doesn't work in the first time. I found a solution afterward by creating a new file extends UIStoryboardSegue and create a method called "perform". It works right now without using prepareSegue in ViewController. I'm copied my previous codes from preparedSegue to "Perform" func in new UIStoryboardSegue file. It print out the message but the delegate doesn't work.

View Controller

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

Custom Segue

class CustomSegue: UIStoryboardSegue {
let transitionManager = TransitionManager()
override func perform() {
    NSLog("Perform");
    let toViewController = self.destinationViewController as UIViewController

    toViewController.transitioningDelegate = self.transitionManager
}
}

I placed breakpoint in every func in Transition Manager, none of them execute and stop.

Segue settings:

enter image description here

Problem: TransitioningDelegate is not working

Full sources codes: here

Upvotes: 0

Views: 419

Answers (1)

matt
matt

Reputation: 534885

The problem is that your perform implementation doesn't do anything:

override func perform() {
    let toViewController = self.destinationViewController as UIViewController
    toViewController.transitioningDelegate = self.transitionManager
}

All you do is create a view controller, give it a transitioning delegate, and then throw it away. You do not perform any transition! But that is exactly the job of a segue. It isn't clear what you can possibly be expecting to happen.

If the idea is that this is supposed to be a present (modal) segue, then you should make it a present (modal) segue in the storyboard, specify your custom segue class, and then, in your perform implementation, call super to do the actual presentation:

override func perform() {
    let toViewController = self.destinationViewController as UIViewController
    toViewController.transitioningDelegate = self.transitionManager
    super.perform() // this will work, _if_ you have specified a present (modal) segue
}

Alternatively, your perform could perform the presentation itself, by calling presentViewController:... on the source view controller with the destination view controller as parameter.

But your perform does nothing. Nothing will come of nothing.

Upvotes: 2

Related Questions