我有两个UIViewControllers。用户以 UIViewController 开头。然后用户点击按钮来玩游戏。因此,应用程序会切换到另一个视图控制器 PlayViewController ,它会显示使用 SKView 的游戏。 ActionScene 是一个 SKScene 子类,负责游戏。当用户失败时,应用程序将显示一个标签(SKLabelNode)并询问他或她是否想要退出游戏。如果用户点击此标签,游戏者将通过PlayViewController返回主视图控制器(UIViewController)。所以我认为ActionScene应该将此任务委托给PlayViewController。以下内容来自ActionScene。
// ActionScene.h
#import <SpriteKit/SpriteKit.h>
@protocol actionDelegate;
@interface ActionScene : SKScene
@property (weak) id <actionDelegate> delegate;
@end
@protocol actionDelegate <NSObject>
@required
// Delegate
- (void)closeScene;
@end
// ActionScene.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
for (UITouch *touch in touches) {
SKNode *n = [self nodeAtPoint:[touch locationInNode:self]];
if (n != self && [n.name isEqual: @"doneLabel"]) { // It was else if before. I've made a change.
[[self childNodeWithName:@"doneLabel"] removeFromParent]; // The user chooses to end the game by tapping doneLabel (SKLabelNode)
[self.delegate closeScene];
}
}
}
对于PlayViewController,它负责向SKView呈现ActionScene,并将用户发送回UIViewController,如下所示。
// PlayViewController.h
#import "ActionScene.h"
@interface PlayViewController : UIViewController <actionDelegate>
@property (strong,nonatomic) ActionScene *actionScene;
@end
// PlayViewController.m
- (void)viewWillLayoutSubviews {
SKView *spriteView = [[SKView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:spriteView];
SKScene *scene = [[ActionScene alloc] initWithSize:spriteView.frame.size];
[self.actionScene setDelegate:self]; // Letting ActionScene delegate a task to itself
[spriteView presentScene:scene];
}
- (void)closeScene {
// It doesn't get a call from ActionScene
}
因此,当用户点击完成标签时,closeScene旨在启动。但此委托方法永远不会接到调用。我在过去的9个月里没有开发过iOS应用程序。但我认为我有正确的想法。我究竟做错了什么?到目前为止,我已阅读this topic,this topic和其他人。
感谢您的帮助。
//其他解释//
答案 0 :(得分:0)
我实现了你的代码,一切都像魅力一样。在一行上设置断点:
[self.delegate closeScene];
看看它是否被调用。
答案 1 :(得分:0)
关于this post,我的绝望措施已经解决了。对PlayViewController.m进行了以下更改,以将用户带回UIViewController。
- (void)viewWillLayoutSubviews {
SKView *spriteView = [[SKView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:spriteView];
SKScene *scene = [[ActionScene alloc] initWithSize:spriteView.frame.size];
[self.actionScene setDelegate:self]; // Letting ActionScene delegate a task to itself
[spriteView presentScene:scene];
}
到
- (void)viewWillLayoutSubviews {
SKView *spriteView = [[SKView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:spriteView];
ActionScene *scene = [ActionScene sceneWithSize:spriteView.bounds.size];
[scene setDelegate:self];
[spriteView presentScene:scene];
}
现在,我可以全速前进我的游戏开发而不用担心。