SpriteKit视图抛出NSInvalidArgumentException [英] SpriteKit view throwing NSInvalidArgumentException

查看:189
本文介绍了SpriteKit视图抛出NSInvalidArgumentException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在下面的代码中加载 viewDidLoad:方法中的场景。

  SKView * spriteView =(SKView *)self.view; 
spriteView.showsDrawCount = YES;
spriteView.showsNodeCount = YES;
spriteView.showsFPS = YES;
PFPiePlanesScene * scene = [PFPiePlanesScene sceneWithSize:self.view.frame.size];
scene.scaleMode = SKSceneScaleModeAspectFill;
[spriteView presentScene:scene];

当我在 spriteView 上调用任何内容时,它崩溃了这条消息:

 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' -  [UIView setShowsDrawCount:]:无法识别的选择器发送到实例0x9685030'

我认为这是因为它没有将实例视为SKView而是作为一个UIView。



提前致谢。



一些额外的:



Sprite工具包使用此代码加载场景

  / /配置视图。 
SKView * skView =(SKView *)self.view;
skView.showsFPS = NO;
skView.showsNodeCount = NO;

//创建和配置场景。
self.scene = [SKMyScene sceneWithSize:skView.bounds.size];
self.scene.scaleMode = SKSceneScaleModeAspectFill;

//呈现场景。
[skView presentScene:self.scene];



并且没有错误。这些课程完全相同。只是进入视图搞砸了吗?



Joe

解决方案

self.view 是一个 UIView 对象。简单地转换指针不会使它成为不同类型的对象。

  SKView * spriteView =(SKView *)self.view; 

spriteView 现在指向对象, self.view 指向编译器,它实际指向 SKView 类型的对象。这就是为什么你没有得到任何编译器错误或警告。在运行时,您发送的消息无法由 spriteView 处理,因为它仍然只是一个 UIView 对象。 / p>

I have this code below that loads a scene in the viewDidLoad: method.

SKView *spriteView = (SKView *) self.view;
spriteView.showsDrawCount = YES;
spriteView.showsNodeCount = YES;
spriteView.showsFPS = YES;
PFPiePlanesScene *scene = [PFPiePlanesScene sceneWithSize:self.view.frame.size];
scene.scaleMode = SKSceneScaleModeAspectFill;
[spriteView presentScene:scene];

When I call anything on the spriteView, it crashes with this message:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView setShowsDrawCount:]: unrecognized selector sent to instance 0x9685030'

I assume this is because it is not treating the instance as a SKView and instead as a UIView.

Thanks in advance.

Some extra:

Sprite kit uses this code to load a scene.

// Configure the view.
SKView * skView = (SKView *)self.view;
skView.showsFPS = NO;
skView.showsNodeCount = NO;

// Create and configure the scene.
self.scene = [SKMyScene sceneWithSize:skView.bounds.size];
self.scene.scaleMode = SKSceneScaleModeAspectFill;

// Present the scene.
[skView presentScene:self.scene];

And, with no error. The classes are the exact same. Would just coming into the view screw this up?

Joe

解决方案

self.view is a UIView object. Simply casting the pointer does not make it a different type of object.

SKView *spriteView = (SKView *) self.view;

spriteView is now pointing to the object, that self.view is pointing to, telling the compiler, that it actually points to an object of type SKView. That's why you don't get any compiler errors or warnings. At runtime you are sending messages that can't be handled by spriteView because it is still just a UIView object.

这篇关于SpriteKit视图抛出NSInvalidArgumentException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆