从UIViewController打开SKScene时出现NSInvalidArgumentException

时间:2015-03-27 06:11:24

标签: objective-c uiviewcontroller sprite-kit skscene invalidargumentexception

我正在创建我的第一个SpriteKit游戏,这就是我想要做的事情:

1。删除默认的Main_iphone和Main_ipad故事板

  • Main_iphone删除Main_ipadinfo.plist个列表。
  • Main_iPhone.storyboard下删除Main Interface         deployment info

2。在didFinishLaunchingWithOptions

下的AppDelegate.m中添加以下代码
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.viewController = [[CMViewController alloc] init];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];

    return YES;

第3。在viewController.m中配置SKScene

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

运行时错误

  

- [UIView presentScene:]:无法识别的选择器发送到实例0x155854d0
  ***由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [UIView presentScene:]:无法识别的选择器发送到实例0x155854d0'
  ****第一次抛出调用堆栈:   (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:以NSException类型的未捕获异常终止   (lldb)

PS:

  • 当我不删除故事板和修改info.plist时,我的所有场景都正常工作。
  • 我正以编程方式创建所有场景和查看控制器。
  • 我尝试过初始化  self.view = [[SKView alloc]initWithFrame:self.view.frame]
  • 下的-(void)loadView

2 个答案:

答案 0 :(得分:1)

您已分配SKView* skView = (SKView*)self.view。 我相信self.view不是 SKView 的子类,所以简单地说它会将你的SKView指向UIView。

虽然构建代码会成功,但你肯定会得到运行时错误,因为你的SKView会发现self.view隐藏了它的真实身份(UIView)在一个零指针SKView后面。

您可能想要更改 3。将视图配置为以下内容:

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

答案 1 :(得分:1)

引发异常是因为您尝试在presentScene类型的视图上调用UIView,而方法属于SKView

故事板默认情况下将self.view类设置为SKView。由于您已删除了故事板,并尝试使用控制器作为正常初始化,因此self.view将以UIView而不是SKView启动。

enter image description here

希望它有所帮助。