objective-cuiviewcontrollersprite-kitsksceneinvalidargumentexception

NSInvalidArgumentException when opening SKScene from UIViewController


I am creating my first SpriteKit game and here's what I am trying to do:

1. Remove default Main_iphone and Main_ipad storyboards

2. Add the following code in AppDelegate.m under didFinishLaunchingWithOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.viewController = [[CMViewController alloc] init];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];

    return YES;

3. Configuring SKScene in viewController.m

-(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    //Configure the view.
    SKView* skView = (SKView*)self.view;
    //Create and configure the scene.
    SKScene* scene = [CMHomeScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;
    //Present the scene.
    [skView presentScene:scene];
 }

Runtime Error

-[UIView presentScene:]: unrecognized selector sent to instance 0x155854d0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView presentScene:]: unrecognized selector sent to instance 0x155854d0'
**** First throw call stack: (0x2c3eac1f 0x39b95c8b 0x2c3f0039 0x2c3edf57 0x2c31fdf8 0x10883d 0x2f8a7433 0x2f2cfa0d 0x2f2cb3e5 0x2f2cb26d 0x2f2cac51 0x2f2caa55 0x2fb0b1c5 0x2fb0bf6d 0x2fb16379 0x2fb0a387 0x32b770e9 0x2c3b139d 0x2c3b0661 0x2c3af19b 0x2c2fd211 0x2c2fd023 0x2f90e3ef 0x2f9091d1 0x10c2d1 0x3a115aaf) libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)

PS:


Solution

  • You have assigned SKView* skView = (SKView*)self.view. I believe self.view is not the subclass of SKView so simply typecasting it would point your SKView to UIView.

    While building the code would be successful but you would definitely get runtime error as your SKView would find that self.view is hiding its real identity (UIView) behind a nil pointer SKView.

    You may want to change your 3. Configure View to following:

        - (void)viewWillLayoutSubviews 
        { 
        // Configure the view. 
        SKView* skView = [[SKView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
        // Create and configure the scene. 
        SKScene* scene = [CMHomeScene sceneWithSize:skView.bounds.size]; 
        scene.scaleMode = SKSceneScaleModeAspectFill; 
        // Present the scene. 
        [skView presentScene:scene]; 
    [self.view addSubview:skView];
        }