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

时间:2015-06-27 10:07:33

标签: ios objective-c uiviewcontroller transition skscene

我正在开发一款游戏,并希望有一个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,我仍然得到这个错误。我怎样才能解决这个问题?感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:1)

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

选项1

如果您希望使用自己的视图替换view属性,可以覆盖UIViewController的{​​{1}}方法并在其中指定视图。它在此方法的类引用中记录:

  

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

     

...

     

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

所以它看起来像这样:

loadView

选项2

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

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

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

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

@property (strong, nonatomic) SKView *skView;