无法使用 Xcode 8 和 Swift 3 在 SpriteKit 中以编程方式触发 segue
Posted
技术标签:
【中文标题】无法使用 Xcode 8 和 Swift 3 在 SpriteKit 中以编程方式触发 segue【英文标题】:Can't programmatically trigger segue in SpriteKit, using Xcode 8 and Swift 3 【发布时间】:2017-04-02 22:46:54 【问题描述】:我正在使用 SpriteKit 在 Xcode 8 中制作游戏,并且一直很难以编程方式触发 segue。我已经进入“Main.storyboard”并在我的“GameViewController”和“MenuViewController”之间进行了一个segue,给它标识符“toMenu”。
尝试 #1 失败
在我的 GameScene.swift 文件中,我将以下代码添加到更新函数中。
override func update(_ currentTime: TimeInterval)
// Called before each frame is rendered
if gameIsRunning == false
score = 0
performSegue(withIdentifier: "toMenu", sender: self)
我的目标是在 gameIsRunning 为 false 时触发 segue。但是,我收到以下错误:
Use of unresolved identifier 'performSegue'
这很奇怪,因为 performSegue 是根据 API Reference 的声明。
尝试 #2 失败
我尝试this solution,将以下代码放入“GameScene.swift”
override func update(_ currentTime: TimeInterval)
// Called before each frame is rendered
if gameIsRunning == false
score = 0
GameScene(MenuViewController, animated: true, completion: nil)
我得到了这个错误:
Type of expression is ambiguous without more context
尝试 #3 失败
我发现this solution 非常混乱,但我还是跟着去了。我已经完成了第1步,所以如第2步所述,我将以下代码放在“GameViewController.swift”的底部
func goToDifferentView()
self.performSegue(withIdentifier: "toMenu", sender: self)
并且没有出错!然后我按照解决方案的步骤 3 中的说明将此代码添加到“GameViewController.swift”
override func viewDidLoad()
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: NSNotification.Name(rawValue: "toMenu"), object: nil)
然后我做了解决方案的第 4 步,所以我将以下代码放入“MenuViewController.swift”
override func viewDidLoad()
super.viewDidLoad()
NotificationCenter.default.post(NSNotification(name: NSNotification.Name(rawValue: "toMenu"), object: nil) as Notification)
然后我将以下代码放入我的“GameScene.swift”文件中以实际调用该函数。
override func update(_ currentTime: TimeInterval)
// Called before each frame is rendered
if gameIsRunning == false
score = 0
GameViewController().goToDifferentView()
然后我在我的 iPhone 上运行我的游戏,一切都很顺利,直到我进入游戏的部分,其中 gameIsRunning 变为 false。我得到了以下错误,而不是 segue 做它的事情:
Thread 1: Signal SIGABRT
我已经多次收到此错误,而且一直是我在“Main.storyboard”中错误地连接了一些东西。然而,这是一个非常简单的游戏,一切看起来都很正常。在添加刚刚向您展示的代码之前,我也没有收到此错误。我已经多次确认 segue 具有标识符“toMenu”。我完全不知道为什么 segue 不起作用以及为什么我的 Attemp #3 会导致 SIGABRT 错误。
【问题讨论】:
这是什么segue? @GlennRay 它的类型是“显示(例如推送)”,它是一个“故事板转场”。我不确定如何获得有关它的任何其他详细信息。 第一个问题很好。提示:如果您想使用粗体,请在一段文本的任一侧使用双星号,它比 html 更容易键入(并且更容易重新编辑)。如果你想在段落中格式化一段内联代码,use a backtick
任一侧。
发布通知语句不应该在if gameIsRunning...
块中吗?
@0x141E 我尝试从失败解决方案的第 4 步中移动 `NotificationCenter.default.post(NSNotification(name: NSNotification.Name(rawValue: "toMenu"), object: nil) as Notification)' #3 从 MenuViewController.swift 中的 viewDidLoad() 到 GameScene.sks 中更新函数的 'if gameIsRunning == false' 部分。我仍然收到 SIGABRT 错误。
【参考方案1】:
由于您试图在 update() 函数中触发此 segue,因此每秒会调用多次。试试下面的代码,它应该可以工作。
override func update(_ currentTime: TimeInterval)
// Called before each frame is rendered
if gameIsRunning == false
score = 0
gameIsRunning = true
NotificationCenter.default.post(NSNotification(name: NSNotification.Name(rawValue: "toMenu"), object: nil) as Notification)
如果您将print("update")
放在您的if
语句中,您就会明白我的意思。在 if 中将 gameIsRunning
bool 设置为 true 将确保它只被调用一次。
【讨论】:
以上是关于无法使用 Xcode 8 和 Swift 3 在 SpriteKit 中以编程方式触发 segue的主要内容,如果未能解决你的问题,请参考以下文章
现有的领域数据库不能在 swift 3.1 xcode 8 中工作
Swift 3 Xcode 8 - SwiftValue encodeWithCoder - 发送到实例的无法识别的选择器
Xcode 8.0 新特性 & Swift 3.0 增加的变动
Xcode 8 和 Swift 无法构建 Objective C 模块'FBSDKLoginKit'