SpriteKit - didMovetoView 未被调用

Posted

技术标签:

【中文标题】SpriteKit - didMovetoView 未被调用【英文标题】:SpriteKit - didMovetoView is not called 【发布时间】:2016-10-07 07:19:52 【问题描述】:

这是我的视图控制器代码

import UIKit
import SpriteKit
import GameplayKit
class GameViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

    if let view = self.view as! SKView? 
        // Load the SKScene from 'GameScene.sks'
        if let scene = SKScene(fileNamed: "GameScene") 
            // Set the scale mode to scale to fit the window
            scene.scaleMode = .aspectFill
            // Present the scene
            view.presentScene(scene)
        

        view.ignoresSiblingOrder = true

        view.showsFPS = true
        view.showsNodeCount = true
    

这是我的 GameScene 代码

import SpriteKit
import GameplayKit

    class GameScene: SKScene 
       override func didMove(to view: SKView) 
            print("gets called")
        

但由于某些原因,在调试区域中,它没有打印“gets call”,这表明 didMove 甚至没有被调用。这里发生了什么事?我错过了什么吗?

【问题讨论】:

是否正在显示场景? Xcode 有一个非常强大的调试器,你可以在if let view = self.view as! SKView? 上设置一个断点,看看是否正在呈现场景。 为此,.sks 文件需要将场景的自定义类字段设置为“GameScene”。我要做的第一件事是仔细检查您是否在 .sks 编辑器中这样做了。如果是这种情况,那么可能是您遇到了模块名称问题。如果您的项目具有多个目标,则可能会发生这种情况 - 您可能必须从构建设置中输入模块名称才能使其适用于该特定目标。 【参考方案1】:

ios 9 方式

在您的 GameViewController 中尝试直接呈现您的 GameScene 而不是通用的 SKScene。

if let scene = GameScene(fileNamed: "GameScene")  
...

记住“fileNamed”不是 .swift 文件的名称,它是用于 xCode 级别编辑器的 .sks 文件的名称。

iOS 10 的新方式

Apple 现在似乎更喜欢像您尝试的那样传递通用的 SKScene。

  if let scene = SKScene(fileNamed: "GameScene")  ... 

要使其正常工作,请转到相关的 .sks 文件并转到右侧的检查器。单击倒数第二项(自定义类),然后在自定义类字段中输入 .swift 文件的名称。

希望这会有所帮助。

【讨论】:

Xcode 8 的默认 SpriteKit 项目在此上下文中使用 SKScene 而不是 GameScene。 .sks 文件中有一个“自定义类”字段,用于指定 SKScene 子类。默认情况下,自定义类设置为 GameScene。也许,OP 无意中改变了这一点。 这不是最好的方法。最好使用SKScene(fileNamed: "GameScene"),因为这可以动态化以适应初始化当前场景的方法,例如SKScene(fileNamed: currentScene) 其中currentScene 可以持久化到例如NSUserDefaults 这样玩家可以在重新开始游戏时返回特定场景。 这仅适用于由于错误而使用 iOS 8 的情况,对于 iOS 9 及更高版本,应使用 Mark Brownswords 方法【参考方案2】:

这可能是因为您没有相关的SKS(在您的情况下为GameScene.sks)文件引用到您的项目,请检查您是否已添加它或由于错误而删除/重命名。

【讨论】:

【参考方案3】:

我终于解决了。

我的项目名称末尾包含一个句点。就像名字“XXXX.”一样。经过几次实验,我发现我可以简单地通过删除句号来解决问题。

【讨论】:

【参考方案4】:

我的建议:

使用

override func didMoveToView(view: SKView)

而不是

override func didMove(to view: SKView)

可能是文档/API 中的命名不一致...

【讨论】:

这只是 Swift 2 和 3 之间的区别...在 Swift 3 中使用 Swift 2 版本会出错,提示将其更改为 Swift 3 版本【参考方案5】:

我赞同 Tom Xue 所说的话,因为他花了太长时间寻找这个问题的答案。我的应用名称中有一个连字符,这似乎是导致问题的原因。当我重命名我的项目时,场景呈现出应有的样子。

【讨论】:

您的帖子不是技术解决方案。这类事情就是下面问题和答案的 cmets 部分的用途。非常不赞成使用“答案”部分进行对话和提问,它仅用于针对技术问题的明确重点解决方案。 对我的帖子的有趣评估。如果我没有提到另一个有类似解决方案的人,我并不想与之交谈,那会不会有不同的看法?例如,如果它只是简单的类似,“SpriteKit 似乎不喜欢应用程序/项目名称中的标点符号。在呈现 GameScene 时遇到过类似的问题,但已通过更改项目名称得到解决。”? 这里的菜鸟一般不了解网站、它的规则、社区、这里的工作方式以及为什么要这样处理。我只是告诉您,网站指南非常清楚地说明了问题和答案的构成。查看顶部的评论链接,社区在这里管理论坛并浏览主题甚至贡献。我已经在这里很久了。我已经学会了这些东西。您的帖子出现在新用户的第一篇帖子或类似内容的评论提示中,我只是遵循审核指南。我没有投票关闭你的帖子,只是为了通知。 顺便说一句:你看到我回复你帖子旁边的小“1”了吗?那是因为审核队列中的其他人看到了我的评论并同意评估。我不是想破坏你的排骨,或者是小气或刻薄。但是,一旦您看到了成千上万的问题和答案,您就会更加了解答案应该是独立的技术 解决方案的原因。 最后,不要只相信我的话,请阅读指南:How to post a good answer

以上是关于SpriteKit - didMovetoView 未被调用的主要内容,如果未能解决你的问题,请参考以下文章

Swift和Spritekit sceneDidLoad被调用多个

Physics Body 边缘 IOS8,Sprite Kit

添加时 SKSpriteNode 未显示

如何控制多个同名精灵套件节点?

切换多个视图控制器时,如何在 didMoveToView() 中调用一次歌曲?

需要帮助更改在 didMoveToView 中调用的 SKSpriteNode 的速度、方向和生成时间