ViewController委托问题

时间:2014-03-18 10:19:32

标签: ios objective-c ios7 delegates viewcontroller

我需要一些帮助。我整天都被困在这个问题上,我无法找到解决办法。我将尝试尽可能清楚地解决我的问题。

我有2个ViewControllers。一个叫做ViewController,另一个叫做GameViewController。在ViewController中,我有我的主屏幕菜单,在GameViewController上我有Game屏幕和Game Over屏幕。当您从ViewController按下播放时,它会将您带到游戏中,然后当您死亡时,您将保持在相同的GameViewController中但在游戏结束视图中。如果您在Game Over屏幕中按重启,则segue会以模态方式将您带回游戏屏幕。

所以这就是我遇到的问题。

当你第一次去世并进入游戏结束屏幕时,你可以点击主页然后它将带你回家,但如果你按重启,然后再次死亡(那是两次)然后尝试从Game Over Screen它不会运行主页按钮内的代码。按钮实际上工作,我有一个NSLog,它显示在调试器屏幕中。我知道很奇怪。请参阅以下代码,该代码将显示我为尝试使其工作所做的一切。

在GameViewController.h中//最重要的是#imports

@class GameViewController;

@protocol GameViewControllerDelegate <NSObject>

-(void) GameViewControllerDidCancel:(GameViewController *)controller;
- (IBAction)homeBtn:(id)sender;

@end

这就在@Interface

中关闭之后
@property (nonatomic, weak) id <GameViewControllerDelegate> delegate;

在@Implementation

之后的GameViewController.m中
@synthesize delegate = _delegate;

这是在我的家里

- (IBAction)homeBtn:(id)sender {

    NSLog(@"home btn pressed");

   [self.delegate GameViewControllerDidCancel:self];

}

然后在我的ViewController.h中

#import "GameViewController.h"

    @interface ViewController : UIViewController <GameViewControllerDelegate> 

ViewController.m

当我按下播放时

- (IBAction)playButton:(id)sender {

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

    UIStoryboard*  sb = [UIStoryboard storyboardWithName:@"Main_iPad"
                                                  bundle:nil];
    GameViewController* controller= [sb instantiateViewControllerWithIdentifier:@"GML"];
    controller.delegate = self;
    [self presentViewController:controller animated:NO completion:nil];
    [audioPlayer stop];
    }else {

        UIStoryboard*  sb = [UIStoryboard storyboardWithName:@"Main_iPhone"
                                                      bundle:nil];
        GameViewController* controller= [sb instantiateViewControllerWithIdentifier:@"GML"];
        controller.delegate = self;
        [self presentViewController:controller animated:NO completion:nil];
        [audioPlayer stop];
    }

}

我尝试从homeBtn调用的方法也在这里

#pragma mark - GameViewControllerDelegate

- (void) GameViewControllerDidCancel:(GameViewController *)controller {

    [self dismissViewControllerAnimated:NO completion:nil];
}

我很确定就是这样。就像我之前说的那样,重启按钮只是链接到一个segue以返回到Game屏幕。

请大家,我现在非常绝望,我完全没有想法。

谢谢

1 个答案:

答案 0 :(得分:0)

相当复杂的视图层次结构,难以理解。

restartGameButton究竟做了什么。它是一个放松的segue?

  

当您从ViewController按下播放时,它会将您带到游戏中,然后当您死亡时,您将保持在相同的GameViewController中但在游戏结束视图中。如果您在Game Over屏幕中按重启,则segue会以模态方式将您带回游戏屏幕。

GameOver view是什么东西?一旦你在GameViewController中说出了一个视图,但是你再次说你是否按下了重启,一个segue会以模态方式返回游戏画面(即GameViewController),这意味着GameOver画面也是{ {1}}。

为什么在它实际上是你想要的导航堆栈时使用模态演示?

我认为最佳解决方案:

制作3个ViewControllers,一个用于开始,一个用于游戏,一个用于GameOver。将ViewControllers嵌入导航控制器中并使用此控制器进行推送和弹出,而不是将多个模态视图相互叠加。