views:

389

answers:

3

Hi,

I'm developing a menu for a game. The menu contains four buttons; Campaign, Training, Highscore and Settings. When I click one of these buttons, a new view controller should be shown. I add the new view controller using this function:

[self.view addSubview:myViewController.view];

It does show the new view controller, but I can still touch the menu buttons from the other view controller that is "behind" the new. I can't see the buttons, but when I touch in the area of a button, the button's IBAction is called.

Of course, I can disable all buttons before adding the subview, but is this the right way to fix it? Should I remove the menu from its subview? I'm using a window-based application and do not have a tab bar or a navigation bar.

Thank you very much!

+1  A: 

You could use a modal view:

[self presentModalViewController:myViewController animated:YES];

I think that would be the right way to do this.

mrueg
Thank you very much. Works good.
Kaloer
A: 

The only problem with what you're doing now is that the touches are getting passed along rather than handled by your new view. I would go one level above the menu, remove the menu and add the new view. If you need the menu back, do the opposite. I tend to use presentModalViewController for short things, like preferences, but for the full game I'd unload the menu. It's your call though.

David Kanarek
A: 

You need to remove the old view from the screen when you add the new one. Three ways to do this, from my most preferred to least preferred:

  1. Use a navigation controller and just turn off the navigation bar (by setting self.navigationController.navigationBarHidden to YES).

  2. Use presentModalViewController:animated:, as subw recommends.

  3. Do the following instead of what you're doing currently:

    [self.view.window addSubview:myViewController.view];
    [self.view removeFromSuperview];
    

There are two main differences between the three approaches.

One is the animation involved. #1 slides the new screen in from the right. #2 slides it up from the bottom (or cross-dissolves or flips, depending on your preference). #3 does not have any animation by default.

The other is how you go back to the menu. In #1, any part of your code (more or less) can call ([self.navigationController popViewControllerAnimated:YES]. In #2, the child view controller calls [self.parentController dismissModalViewControllerAnimated:YES]. #3 has no simple way to go back; you have to do it manually, which involves keeping a reference to the menu view controller in each of the other view controllers.

Brent Royal-Gordon
Thanks. I'll take a look at it.
Kaloer