【问题标题】:SpriteKit view throwing NSInvalidArgumentExceptionSpriteKit 视图抛出 NSInvalidArgumentException
【发布时间】:2013-11-29 01:58:25
【问题描述】:

我在下面有这段代码,它在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 上拨打任何电话时,它会因以下消息而崩溃:

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

我认为这是因为它没有将实例视为 SKView,而是将其视为 UIView。

提前致谢。

一些额外的:

Sprite 套件使用此代码加载 场景

// 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];

而且,没有错误。类是完全相同的。只是进入视野会搞砸吗?

【问题讨论】:

  • 根本不是那个类。尝试在调试模式下打印 - 它不会将 UIView 转换为 SKView - 如果它不是 SKView :)
  • @GrzegorzKrukowski 这以前有效。 “调试模式”是什么意思?我如何访问它?
  • "Sprite 套件使用此代码加载视图。"你从哪里得到那个的?还有self.view是什么?
  • 好吧,既然这是在视图控制器中,self.view 是视图控制器控制的视图。通过视图,我的意思是场景。会编辑。 @塞巴斯蒂安
  • 您是否完成了第 1 步:“打开项目的故事板。它有一个视图控制器 (SpriteViewController)。选择视图控制器的视图对象并将其类更改为 SKView。”

标签: ios objective-c sprite-kit


【解决方案1】:

如果您遵循苹果的步骤,您跳过了以下部分:“打开项目的情节提要。它有一个视图控制器 (SpriteViewController)。选择视图控制器的视图对象并将其类更改为 SKView。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我不太确定你到底想做什么。您可以将SKView 对象作为子视图添加到您的视图中,或者确保您的视图控制器有一个SKView 作为它的根视图。
    • 只需单击故事板中的视图控制器,然后单击树中的“视图”,然后将自定义类设置为右侧的 SKView。
    【解决方案3】:

    不要忘记在 Linked Frameworks and Libraries 下添加 SpriteKit.framework。

    干杯, 杰西

    【讨论】:

      【解决方案4】:

      你要做的就是将视图的子类从 UIView 更改为 SKView 在该视图下选择你的 viewcontroller 并更改它的子类

      【讨论】:

        【解决方案5】:

        @Sebastian 不正确。

        我猜你正在追随苹果的脚步。 也许以下教程会有所帮助:

        http://www.raywenderlich.com/49625/sprite-kit-tutorial-space-shooter

        【讨论】:

          【解决方案6】:

          在将您的 UIView 转换为 SKView 之前,您必须确保在情节提要中将您的自定义类设置为 SKView。

          【讨论】:

            【解决方案7】:

            如果您注意到第一个视图控制器在头文件中带有这些导入。

             #import <UIKit/UIKit.h>
            

            #import &lt;SpriteKit/SpriteKit.h&gt;

            当你创建一个新的视图控制器时,默认不包括 Spritekit。添加精灵套件后,它应该可以使用苹果提供的默认代码

            【讨论】:

            • 并更改类标题中的 UIViewcontroller 不适用于 SKView
            • 通过添加一个中间的 Skview 类来解决这个问题,该类被初始化而不是获取 UIViewcontroller 的视图!
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多