ViewController 委托问题

Posted

技术标签:

【中文标题】ViewController 委托问题【英文标题】:ViewController Delegate Issue 【发布时间】:2014-03-18 10:19:31 【问题描述】:

我需要一些帮助。我整天都被这个问题困住了,我找不到解决办法。我会尽量清楚我的问题。

我有 2 个视图控制器。一种称为 ViewController,另一种称为 GameViewController。在 ViewController 我有我的主屏幕菜单,在 GameViewController 我有游戏屏幕和游戏结束屏幕。当你从 ViewController 按下 play 时,它会将你带到 Game,然后当你死后,你会留在同一个 GameViewController 但在 Game Over 视图中。如果您在 Game Over 屏幕中按重新启动,segue 会以模态方式将您带回 Game Screen。

这就是我遇到的问题。

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

在 GameViewController.h //上面所有的#imports

@class GameViewController;

@protocol GameViewControllerDelegate <NSObject>

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

@end

这只是在 @Interface 中的 close 之后

@property (nonatomic, weak) id <GameViewControllerDelegate> delegate;

在 @Implementation 之后的 GameViewController.m 中

@synthesize delegate = _delegate;

这个在我家Btn

- (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 返回到游戏屏幕。

拜托各位,我现在真的很绝望,我完全没有想法。

谢谢

【问题讨论】:

您是否通过将NSLog添加到GameViewControllerDidCancel委托方法来检查该方法是否被调用? 在标题中加上 URGENT 不会帮助您获得更好/更快的帮助。 我在 Viewcontroller 的 GameViewControllerDidCancel 方法中添加了一个 NSLog。如果我不在 gameOver 屏幕中重新启动,则会出现日志。但是,如果我重新启动然后死掉并按主页,则日志不会出现。但是 HomeBtn 中的 NSLog 确实出现了。所以按钮正在工作,但方法没有触发 jcm 写“在标题中添加紧急信息不会帮助您获得更好/更快的帮助”也对我没有帮助。干杯 【参考方案1】:

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

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

当你从 ViewController 按下 play 时,它会将你带到 Game,然后当你死时,你会留在同一个 GameViewController 中,但在 Game Over 视图中。如果您在 Game Over 屏幕中按下重新启动,segue 会以模态方式将您带回 Game Screen。

GameOver view 是什么?一旦你在GameViewController 中说它是一个视图,但你又说如果你按下重新启动,一个segue 会以模态方式将你带回游戏屏幕(即GameViewController),这意味着GameOver 屏幕也是ViewController

当它实际上是您想要的导航堆栈时,为什么要使用模式表示?

我认为的最佳解决方案:

制作 3 个 ViewController,一个用于 Start,一个用于 Game,一个用于 GameOver。将 ViewController 嵌入到导航控制器中,然后使用该控制器进行推送和弹出,而不是在另一个之上呈现许多模式视图。

【讨论】:

嗨马里奥,GameViewController 拥有 2 个视图。 GameView 和 GameOverView。 GameOverView 被隐藏。当你死时 GameOverView 是不隐藏的。然后当你按下重新启动它的隐藏再次。我已将重新启动按钮链接到 GameViewController,以便它可以再次重新启动游戏。这是错误的做法吗? 那么重启游戏的代码是什么,因为上面你说重启按钮“带你回到游戏屏幕”。这与取消隐藏视图完全不同。请参阅我的编辑最佳解决方案。导航控制器将为您提供最好的帮助。如果你不想要导航栏,你可以将它隐藏在导航控制器中。 是的,我的意思是,在情节提要中,我控制单击重新启动按钮并将其拖到我的 GameViewController 中,然后选择 Modal。按钮中没有代码只是那个segue 那行不通。当您控制单击并选择模式时,它会创建一个 segue。这个 segue 每次都会实例化一个新的视图控制器并以模态方式呈现它。这意味着永远不会设置委托。所以实际上,像这样,您实际上并没有隐藏 gameOverView,而是创建了一个新的 GameViewController,而 gameOverView 最初是隐藏的。所以用它制作 3 个 Viewcontrollers 并像我说的那样让它快速工作。然后阅读 segues 以更好地理解问题。 谢谢马里奥,我会试试你说的。我正在努力学习伙伴,所以感谢您的耐心:)。欢呼

以上是关于ViewController 委托问题的主要内容,如果未能解决你的问题,请参考以下文章

如何找到推送了哪个 viewController?

ViewController 委托问题

ViewController 委托和 viewWillDisappear 计时问题

ViewController 关闭 swift ios

如何在没有 StoryBoard 的两个 ViewController 之间使用委托?

无法使用 mapKit 从 ViewController 将坐标发送到具有委托的另一个 viewController