tags:

views:

752

answers:

4

Hi.

I have created an application with a modal view that I can display and then dismiss. Is there an easy way to know when the modal view has been dismissed? I would like to reload the data in a table once the modal view has been dismissed and don't know the best way of doing this.

Thanks

+1  A: 

UIViewController has a property called parentViewController. In the case that a view controller is presented modally, the parentViewController property points to the view controller that presented the modal view controller.

In your modal view controller, in viewWillDisappear: you can send a message to the parentViewController to perform any action you wish, essentially.

Something like:

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.parentViewController doSomething];
}

If your parent view controller is a table view controller, then you should be able to call [self.parentViewController.tableView reloadData]; to do what you're trying to achieve.

Jasarien
Thanks a lot for the quick reply Jasarien, will give that a go a bit later.
Jack
Why did I get a downvote for this answer?
Jasarien
Not from me you didn't
Jack
I tried this and I got this error. Am I doing it wrong? I added a method to the parent view called it "reloadData" then called this in viewWillDisappear: [self.parentViewController reloadData];-[UITabBarController reloadData]: unrecognized selector sent to instance 0x4a215e0'
Brodie
+3  A: 

The recommended way to do this would be to use a delegate from your modal view controller back to the view controller that opened the view. Check out the official docs for examples.

The reason that this is the recommended way is so that the ViewController that originally started the modal will also be in control of dismissing it.

It is really simple to do and think more elegant that than using viewWillDisappear - as there are other reasons why view could dissapear!

create a protocol on your modal ViewController - xViewControllerDelegate

@protocol xViewControllerDelegate

    - (void) modalDialogFinished;

@end

Then make your parent implement the delegate using the <xViewControllerDelegate> when you define your parent view controller.

You will be forced to have a method called modalDialogFinished in your parent view controller - which can handle dismiss command and the refresh etc.

Remember to pass anid<xViewControllerDelegate> into the modal view controller in your init code and store it as a field on the object.

When you want to disssmiss your modal view then you just need to reference the delegate.modalDialogFinished.

If this doesn't make sense then I can point you to some better example code - but I hope using delegates is not new to you.

UPDATE::

Here is the official Apple documentation on how to do this for a modal view controller:

http://developer.apple.com/iphone/library/featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ModalViewControllers.html

Grouchal
A: 

Hi I was hoping you could point me to some better example code

d3v3l0p3r
It might be worth asking a new question to get this.
Jack
@Anthony if this was you responding to my answer - you need to use comments - not start a separate answer!I have updated my answer with a link to the official documentation on how to do this.
Grouchal
A: 

I wrote blog post that walks through a simple protocol/delegate example that may help:

The Basics of Protocols and Delegates

John