如何将以编程方式创建的视图控制器的视图设置为 SKYView?

How to set view of programatically created view controller to 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 并在其初始化中将视图设置为只是 SKView,我仍然收到此错误。我怎样才能解决这个问题?感谢您的时间和帮助。

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

选项 1

如果您希望用您自己的视图替换视图 属性,您可以覆盖 UIViewControllerloadView 方法并在那里分配视图。此方法的 class 参考文献中对此进行了记录:

The view controller calls this method when its view property is requested but is currently nil. This method loads or creates a view and assigns it to the view property

...

You can override this method in order to create your views manually. If you choose to do so, assign the root view of your view hierarchy to the view property

所以它看起来像这样:

- (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];
}