简体   繁体   中英

modal view controller not calling presenting view controller's dismissModalViewControllerAnimated: method

In my modal view controller I have a button handling method that includes

[self dismissModalViewControllerAnimated: YES];

In the presenting view controller I override dismissModalViewControllerAnimated: as follows:

-(void) dismissModalViewControllerAnimated: (BOOL)animated
{
  NSLog(@"dismiss");
  [super dismissModalViewControllerAnimated: animated];
}

When the button is touched, the button handling method gets called, but the dismissModalViewControllerAnimated: override does not seem to get called: the NSLog(@"dismiss"); statement isn't called, and a breakpoint inside the method doesn't get hit.

I tried

[[self presentingViewController] dismissModalViewControllerAnimated: YES];

but that didn't work either. However, the modal view controller does get dismissed.

Any idea what might be going wrong?

from Programming iOS 6, by Matt Neuburg :

On the iPad, when the presented view controller's modalPresentationStyle is UIModalPresentationCurrentContext, a decision has to be made as to what view controller should be the presented view controller's presentingViewController. This will determine what view will be replaced by the presented view controller's view. This decision involves another UIViewController property, definesPresentationContext (a BOOL). Starting with the view controller to which presentViewController:animated:completion: was sent, we walk up the chain of parent view controllers, looking for one whose definesPresentationContext property is YES. If we find one, that's the one; it will be the presentingViewController, and its view will be replaced by the presented view controller's view. If we don't find one, things work as if the presented view controller's modalPresentationStyle had been UIModalPresentationFullScreen.

TL;DR
1. set definesPresentationContext to true on the desired presentingViewController
2. set modalPresentationStyle to UIModalPresentationCurrentContext on the desired presentedViewController

This is normally handled by declaring your presenting view controller as a delegate for your modal view controller. The modal VC then called a delegate method in the presenting VC to dismiss the modal transition it created.

Example:

Modal VC.h:

@protocol ModalViewControllerDelegate
-(void)dismissMyModalViewController;
@end

Modal VC.m:

// When you want to dismiss the Modal VC
[delegate dismissMyModalViewController]; 

Presenting VC.h:

// Make sure to #import ModalVC.h
@property (nonatomic, retain) id <ModalViewControllerDelegate> delegate;

Presenting VC.m:

-(void)dismissMyModalViewController {
    [self dismissModalViewControllerAnimated:YES];
}

The code that presented the modal view controller was contained in a UIViewController, which was in turn contained in a UINavigationController. When I called

[[self presentingViewController] dismissModalViewControllerAnimated: YES];

or

[self dismissModalViewControllerAnimated: YES];

the dismissal message was being sent to the UINavigationController object.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM