I am developing a game and would like to have one sprite-kit scene have its own view controller (a conclusion I've reached after much debate), and would like to avoid using storyboard (I can accomplish what I want with storyboard, but would like to learn how to do it without storyboard).
In my main view controller, after clicking a button, I have the following code
MyViewController2 *test = [[MyViewController2 alloc] init];
test.view = [[SKView alloc] init];
[self presentViewController: test animated:YES completion:nil];
However, this just transitions a grey screen with nothing on it (did not overwrite "-(id)init" yet). The following code gets called if I overwrite the "-(id)init" method in MyViewController2:
-(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;
}
but it won't display because I get this error:
-[UIView presentScene:]: unrecognized selector sent to instance
I know what this error means (the presentScene can only be executed by skView and can't be executed by UIView), but even though when I create the ViewController and in its init I set views to be only SKView, I still get this error. How can I fix this? Thanks for your time and help.
The
view
property is managed by theUIViewController
and represents the root view. You cannot simply assign your own view at any point.Option 1
If you wish to replace the view property with your own view you can override
UIViewController
'sloadView
method and assign the view there. It is documented in the class reference for this method:So it will look something like this:
Option 2
You can add your SKView as a subview.
Add a property to your view controller so you can access it when necessary:
Initialize and add it as a subview when the view is loaded: