我正在开发一款游戏,并希望有一个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,我仍然得到这个错误。我怎样才能解决这个问题?感谢您的时间和帮助。
答案 0 :(得分:1)
view
属性由UIViewController
管理,代表根视图。您无法在任何时候简单地指定自己的视图。
选项1
如果您希望使用自己的视图替换view属性,可以覆盖UIViewController
的{{1}}方法并在其中指定视图。它在此方法的类引用中记录:
视图控制器在其view属性为的时调用此方法 要求但目前为零。此方法加载或创建视图并将其分配给视图属性
...
您可以覆盖此方法以手动创建视图。 如果选择这样做,请将视图层次结构的根视图指定给 视图属性
所以它看起来像这样:
loadView
选项2
您可以将SKView添加为子视图。
向视图控制器添加属性,以便在必要时访问它:
- (void)loadView
{
self.view = [[SKView alloc] init];
}
在加载视图时初始化并将其添加为子视图:
@property (strong, nonatomic) SKView *skView;