Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Update UIViewController after Dismissing Modal Segue

I am currently designing the structure for my first iPhone game and ran into a problem. Currently, I have a 'MenuViewController' that allows you to pick the level to play and a 'LevelViewController' where the level is played.

A UIButton on the 'MenuViewController' triggers a modal segue to the 'LevelViewController'.

A UIButton on the 'LevelViewController' triggers the following method to return to the 'MenuViewController':

-(IBAction)back:(id)sender //complete
{
    [self dismissModalViewControllerAnimated:YES];
}

The problem is, I have a UILabel on the menu page that prints the number of total points a player has. Whenever I go back to the menu from the level, I want this label to automatically update. Currently, the label is defined programmatically in the 'MenuViewController':

-(void)viewDidLoad {
    [super viewDidLoad];
    CGRect pointsFrame = CGRectMake(100,45,120,20);
    UILabel *pointsLabel = [[UILabel alloc] initWithFrame:pointsFrame];
    [pointsLabel setText:[NSString stringWithFormat:@"Points: %i", self.playerPoints]];
    [self.pointsLabel setTag:-100]; //pointsLabel tag is -100 for id purposes
}

self.playerPoints is an integer property of MenuViewController

Is there a way I could update the label? Thanks ahead of time!

like image 875
felix_xiao Avatar asked Jan 15 '23 19:01

felix_xiao


1 Answers

This is a perfect case for delegation. When the LevelViewController is done, it needs to fire off a delegate method which is handled in the MenuViewController. This delegate method should dismiss the modal VC and then do whatever else you need it to do. The presenting VC should normally handled the dismissal of modal views it presents.

Here is a basic example of how to implement this:

LevelViewController.h (Above the Interface declaration):

@protocol LevelViewControllerDelegate
    -(void)finishedDoingMyThing:(NSString *)labelString;
@end

Same file inside ivar section:

__unsafe_unretained id <LevelViewControllerDelegate> _delegate;

Same File below ivar section:

@property (nonatomic, assign) id <LevelViewControllerDelegate> delegate;

In LevelViewController.m file:

@synthesize delegate = _delegate;

Now in the MenuViewController.h, #import "LevelViewController.h" and declare yourself as a delegate for the LevelViewControllerDelegate:

@interface MenuViewController : UIViewController <LevelViewControllerDelegate>

Now inside MenuViewController.m implement the delegate method:

-(void)finishedDoingMyThing:(NSString *)labelString {
    [self dismissModalViewControllerAnimated:YES];
    self.pointsLabel.text = labelString;
}

And then make sure to set yourself as the delegate for the LevelViewController before presenting the modal VC:

lvc.delegate = self;  // Or whatever you have called your instance of LevelViewController

Lastly, when you are done with what you need to do inside the LevelViewController just call this:

[_delegate finishedDoingMyThing:@"MyStringToPassBack"];

If this doesn't make sense, holler and I can try to help you understand.

like image 148
LJ Wilson Avatar answered Jan 27 '23 23:01

LJ Wilson