Modal view controller won't dismiss itself

佐手、 提交于 2019-11-29 23:45:13
Mazyod

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];
}

What's the code you're using to dismiss the modal view controller? I've seen code like this:

[self.parentViewController dismissModalViewControllerAnimated: YES];

that doesn't work on all versions of the OS. However, this:

[self dismissModalViewControllerAnimated: YES];

should.

I had the same problem, also affects those who use:

 [self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];

I fix it with a Observer, adding this where you had the dismiss:

[[NSNotificationCenter defaultCenter] postNotificationName:@"yourObserverName" object:self];

And this in the parent parent view controller:

// add in viewDidLoad for example
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissModalVCFromParent:) name:@"yourObserverName" object: nil];

//The function
- (void) dismissModalVCFromParent:(NSNotification *)notif
{
   [self dismissModalViewControllerAnimated:YES];
}

// Don't forget remove
[[NSNotificationCenter defaultCenter] removeObserver:self];

This seems to work on the (now final version of) ios 5.

I notice that you have to tap is a specific region to dismiss the page curl - tapping near the edges of the top portion of the screen does not seem to do anything, but the center, blurred section above the page curl graphic consistently results in dismissing the modal view.

I'm not sure whether that narrow tap region behavior is new to ios 5 or already existed and I never noticed before. Hopefully that is helpful!

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];
}
Linda Saul

Thanks guys, this saved me a lot of time. I just noticed that the presentModalViewController and dismissModalViewController methods are deprecated according to the source code for UIViewControoler.h. There are alternative presentViewController and dismissViewController methods.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!