【问题标题】:SpriteKit - didMovetoView is not calledSpriteKit - didMovetoView 未被调用
【发布时间】: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 编辑器中这样做了。如果是这种情况,那么可能是您遇到了模块名称问题。如果您的项目具有多个目标,则可能会发生这种情况 - 您可能必须从构建设置中输入模块名称才能使其适用于该特定目标。

标签: ios swift xcode sprite-kit


【解决方案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
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多