Simple Sprite Kit Scene setup going wrong

I’m trying to set up a simple Sprite Kit setup.
All I’m doing is re-creating the default xCode template ‘Sprite Kit Game’ from an ‘Empty Application’.

It keeps crashing on the skView.showsFPS = YES; line. Which I can’t explain. Can you? Thanks!

  • CGContextSetFillColorWithColor: invalid context 0x0
  • AES encryption in swift
  • iOS Swift: Separate AppDelegate for XCTest
  • Provisioning New Device for Development Xcode
  • Can you animate a height change on a UITableViewCell when selected?
  • What does this mean? “Writable atomic property 'fileManager' cannot pair a synthesized setter/getter with a user defined setter/getter”
  • Some code:

    AppDelegate.m

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions
    {
      self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
      MenuController *menuController = [[MenuController alloc] init];
      self.window.rootViewController = menuController;
      [self.window makeKeyAndVisible];
      return YES;
    }
    

    MenuController.m

    - (void)viewDidLoad
    {
      [super viewDidLoad];
    
      SKView *skView = (SKView *)self.view;
      skView.showsFPS = YES;
      skView.showsNodeCount = YES;
    
      MultiplayerView *gameView = [MultiplayerView sceneWithSize:skView.bounds.size];
      gameView.scaleMode = SKSceneScaleModeAspectFill;
    
      [skView presentScene:gameView];
    }
    

    When I launch this, the following error occurs:

    2013-11-10 13:08:01.605 ByS[9419:70b] -[UIView setShowsFPS:]: unrecognized selector sent to instance 0x10c00bc60
    2013-11-10 13:08:01.608 ByS[9419:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView setShowsFPS:]: unrecognized selector sent to instance 0x10c00bc60'
    

    3 Solutions Collect From Internet About “Simple Sprite Kit Scene setup going wrong”

    In the interface builder, change the class of the window’s view to SKView. Type-casting a UIView into SKView won’t do anything unless the UIView was previously obtained by casting a SKView.

    I had the same issue when starting from a single-view or empty application, vs the usual SpriteKit template. Mine worked when I added some code I found to overwrite the loadView method. Try putting it just above your viewDidLoad in your View Controller.

    - (void)loadView {
        CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
        SKView *skView = [[SKView alloc] initWithFrame:applicationFrame];
        self.view = skView;
    }
    

    The .h file is the usual UIViewController. And remember to #import after you have linked the framework!:

    @interface CharacterViewController : UIViewController
    

    So the full .m code would be something like:

    @implementation CharacterViewController
    
    - (void)loadView {
        CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
        SKView *skView = [[SKView alloc] initWithFrame:applicationFrame];
        self.view = skView;
    }
    
    
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
        }
        return self;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        NSLog(@"CharacterViewController viewDidLoad");
        // Do any additional setup after loading the view.
    
        // Configure the view.
        SKView * skView = (SKView *)self.view;
        skView.showsFPS = YES;
        skView.showsNodeCount = YES;
    
    
        // Create and configure the scene.
        CharacterScene *character = [[CharacterScene alloc]initWithSize:CGSizeMake(skView.bounds.size.width, skView.bounds.size.height)];
    
        character.backgroundColor = [UIColor blueColor];
    
        [skView presentScene:character];
    
    }
    

    Or you can fix it fast and dirty in prepareForSegue: or before any other presentation

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
         UIViewController *destinationVC = segue.destinationViewController;
         SKView * skView = (SKView *)destinationVC.view;
    
        if (![skView isKindOfClass:[SKView class]]) {
            skView = [[SKView alloc] initWithFrame: skView.frame]; // self.view.bounds
            destinationVC.view = skView;
        }
    }