Reputation: 4212
My main view controller is in a navigation controller and it conforms to EditViewControllerDelegate
protocol. It is the delegate of my two view controllers that I need to present modally.
@interface EditViewController : UIViewController
@property (nonatomic) id <EditViewControllerDelegate> delegate;
@end
@interface EditSomethingViewController : EditViewController
@end
@interface EditSomethingElseViewController : EditViewController
@end
In a editViewController:(EditViewController *)evc didFinishEditing:(Something *) something
method, I first get the data I need then I dismiss the evc
and call
[self performSegueWithIdentifier:@"My Segue" sender:self];
"My Segue" is defined in Xcode and the identifier is the same both in code and in Xcode (I tried to change it just to see if it gets called and it throws an exception)
When I change "My Seque"'s type to push, it worked. But with modal it doesn't do anything after I'm back to the main view controller
What am I missing?
EDITED:
I accidentally found out a warning in my storyboard! (it's weird because it's not a warning in the project "visible from everywhere") In the connections' inspector under "Referencing Storyboard Segues" there's a warning for my modal segue. it says :
(null) is not a valid containment controller key path
I checked other modal segues and there is the same warning, but I didn't need to trigger them by code so didn't have problems before.
EDITED 2:
-(void)editViewController:(EditViewController *) evc
didFinishEditing:(Something *) something
{
self.something = something;
[self dismissModalViewControllerAnimated:YES];
For ( OtherThing * otherThing in self.something.otherthingsArray)
{
NSLog(@"%@", otherThing);
}
[self performSegueWithIdentifier:@"My Segue" sender:self];
}
Upvotes: 8
Views: 14368
Reputation: 1
In my case, I was able to perform the segue once successfully; but not subsequent times. There was no particular fatal error thrown, and use of the DispatchQueue.main.async
did not help me either.
Eventually, I remembered I had it working on a separate branch at one point in time. The resolution ended up being pretty silly; where I was using a "Show Detail" style of segue, I had to change it to a "Present Modally" segue. This, for whatever reason, allowed me to perform it multiple times again.
Upvotes: 0
Reputation: 8715
You need to wait until your other view controller is done animating, before performing the segue. You can use the new iOS 5 method:
[self dismissViewControllerAnimated:YES completion:^() {
[self performSegueWithIdentifier:@"My Segue" sender:self];
}];
If you need a pre-iOS 5 way to do it, you should just add a delay to give the animation time before performing the segue.
Upvotes: 21