user2117204
user2117204

Reputation:

Give IBAction priority instead of segue

I'm using storyboard, and in my storyboard I got a button which I connected with another view controller. So when you click the button, the other view controller shows up. I connected this using an Action Segue - Push in the storyboard. I also connected the button with an IBAction property. The problem is when I click the button it first goes to the view controller that its connected to, and after that it executes the IBAction function. How can I change this order?

Upvotes: 3

Views: 1808

Answers (3)

IdleGod
IdleGod

Reputation: 369

I solved this by chaining the IBAction from my segue. I find this approach the most useful as I can have a "save" action without a segue (chain a button to the IBAction, sometimes useful), and also use a segue for dismissing the view controller when necessary.

-(IBAction)save:(id)sender
{
 /* Do some Save stuff */
}

Then in my prepareForSegue:sender:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"save"])
    {
        [self save:sender];
    }
}

Link up your non-segue buttons to the IBAction, and segue your unwind or other such buttons with an identifier as "save". Magic.

Upvotes: 0

Chris Wagner
Chris Wagner

Reputation: 21013

The question to ask yourself is, why are you using both? Pick one and stick with it IMO.

If you want to perform some actions when the segue happens you should implement

prepareForSegue:

Update to address comment

I actually don't know how I can do it in code, how can I load a ViewController that is on my storyboard without using the Action Segue Push?

The easiest way that I've found is in your Storyboard you can set an identifier for the view controller.

enter image description here

Notice Storyboard ID is set to MyViewController

Now in your IBAction method you can do the following.

UIViewController *myViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"MyViewController"];
[self presentViewController:myViewController animated:YES completion:nil];

Upvotes: 0

Hermann Klecker
Hermann Klecker

Reputation: 14068

You cannot change that order. There are two things that you can do.

First: Use the segue only. Overwrite prepareForSegue: and place your code there. If there is more than one segure from that view controller then you can distinguish within prepareForSegue: which one is currently being performed. For that you should provide them with unique names/segue IDs.

Second: Use the IBAction only. Within the IBAction method, at its very end, call performSegueWithIdentifier:sender:. Again, for that you will have to name all your segues with unique segue IDs.

Upvotes: 3

Related Questions