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 委托和 viewWillDisappear 计时问题