如何设置以编程方式创建的视图控制器到SKView的视图?

我正在开发一款游戏,并希望有一个sprite-kit场景有自己的视图控制器(经过多次辩论我得出的结论),并且想避免使用故事板(我可以用故事板完成我想要的,但是想学习如何在没有故事板的情况下做到这一点)。

在我的主视图控制器中,单击按钮后,我有以下代码

MyViewController2 *test = [[MyViewController2 alloc] init]; test.view = [[SKView alloc] init]; [self presentViewController: test animated:YES completion:nil]; 

但是,这只是在灰色屏幕上没有任何内容(没有覆盖“ – (id)init”)。 如果我在MyViewController2中覆盖“ – (id)init”方法,则会调用以下代码:

 -(id)init { NSLog(@"init overwrite works"); SKView * skView = (SKView *)self.view; SKScene2 *scene = [SKScene2 sceneWithSize:skView.bounds.size]; scene.scaleMode = SKSceneScaleModeFill; [skView presentScene:scene]; return self; } 

但它不会显示,因为我收到此错误:

 -[UIView presentScene:]: unrecognized selector sent to instance 

我知道这个错误意味着什么(presentScene只能由skView执行而且不能由UIView执行),但即使我创建ViewController并在其init中设置视图只是SKView,我仍然会收到此错误。 我怎样才能解决这个问题? 感谢您的时间和帮助。

view属性由UIViewController管理,表示根视图。 您无法在任何时候简单地分配自己的视图。

选项1

如果您希望用自己的视图替换view属性,可以覆盖UIViewControllerloadView方法并在那里分配视图。 它在此方法的类引用中记录:

视图控制器在请求其view属性但当前为nil时调用此方法。 此方法加载或创建视图并将其分配给view属性

您可以覆盖此方法以手动创建视图。 如果选择这样做,请将视图层次结构的根视图分配给视图属性

所以它看起来像这样:

 - (void)loadView { self.view = [[SKView alloc] init]; } 

选项2

您可以将SKView添加为子视图。

将属性添加到视图控制器,以便在必要时访问它:

 @property (strong, nonatomic) SKView *skView; 

在加载视图时初始化并将其添加为子视图:

 - (void)viewDidLoad { [super viewDidLoad]; self.skView = [[SKView alloc] init]; [self.view addSubview:self.skView]; SKScene2 *scene = [SKScene2 sceneWithSize:self.skView.bounds.size]; scene.scaleMode = SKSceneScaleModeFill; [self.skView presentScene:scene]; }