Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Modal view controller won't dismiss itself

What I'm doing:

In my app, I'm presenting a modal view controller (containing app settings) using the following code:

    optionsViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;     [self presentModalViewController:optionsViewController animated:YES]; 

This transition just curls up the bottom part of the view to expose a few settings. (See the 'Maps' app for an example.) When you tap on the top half of the page, where the original view is still there but grayed out, the modal view controller is automatically dismissed (handled by the OS, I didn't code for this).

-

What's not working:

This is working fine in iOS 4 (my app is currently on the App Store in fact). But in iOS 5, it looks like Apple have changed the behavior of this transition, and the view controller no longer dismisses itself. I'm trying to replicate the behavior that was handled by the OS before, but can't figure out how to.

-

What I've tried:

Adding an invisible button to the top of the options view doesn't work. The page then curls up the full way, which I don't want.

Apart from this, I'm stuck. How should I replicate how this worked originally (or was I doing it the wrong way from the start!). Any help is much appreciated!

like image 418
Jordan Smith Avatar asked Jul 02 '11 13:07

Jordan Smith


People also ask

How do you dismiss a modal view controller?

According to the View Controller Programming guide for iPhone OS, this is incorrect when it comes to dismissing modal view controllers you should use delegation. So before presenting your modal view make yourself the delegate and then call the delegate from the modal view controller to dismiss.

Can a view controller dismiss itself?

The presenting view controller is responsible for dismissing the view controller it presented. If you call this method on the presented view controller itself, UIKit asks the presenting view controller to handle the dismissal.


1 Answers

Dude, I ran into the same problem.. and here is what I found about using parentViewController:

Note that as of 5.0 this no longer will return the presenting view controller.

This was written in the header file of UIViewController...

I am using ShareKit, and the modalViewController was working perfectly in iOS4, but in iOS5, it just won't dismiss itself! This is because in their code, they are using:

    [[currentView parentViewController] dismissModalViewControllerAnimated:animated]; 

and parentViewController will return nil, since this is a modal presented view controller...

By searching for a solution, I found your question.. So, I decided to fix it myself :P

I changed the previous line to this:

    [currentView dismissModalViewControllerAnimated:YES]; 

Works like a charm.


EDIT: Depending on how you interpret the original question, there are two answers. Here's the second:

In iOS5 it seems that the modal controller only dismisses itself when you click the curl, but not above the curl or the backgound. In iOS5, in order to actually get the modal view to dismiss itself when tapping the background or above the curl I added the following code to the controller, to listen to taps on the modal view, but ignore taps to buttons. This should mimic the behavior in previous version of iOS when working with a modal controller with page curl.

- (void)viewDidLoad {     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];     tap.numberOfTapsRequired = 1;     tap.numberOfTouchesRequired = 1;     tap.delegate = self;               [backgroundView addGestureRecognizer:tap]; }  - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{     //change it to your condition         if ([touch.view isKindOfClass:[UIButton class]]) {              return NO;     }     return YES; }  - (void)handleTap:(UITapGestureRecognizer *)sender {     [self dismissModalViewControllerAnimated:YES]; } 
like image 175
Mazyod Avatar answered Sep 19 '22 17:09

Mazyod