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