如何在 GameScene 中从 ViewController 调用方法 [英] How to call method from ViewController in GameScene

查看:23
本文介绍了如何在 GameScene 中从 ViewController 调用方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的 viewController 中有一个自定义转场的方法,如下所示:

I have a method that has a custom segue in my viewController that looks like this:

func gameOver() {
    performSegueWithIdentifier("GameOver", sender: nil)
}

我在 GameScene.swift 中像这样调用方法:

I call the method like so in GameScene.swift:

 GameViewController().gameOver()

我仔细检查了 segue 名称,它是正确的.每当我在 GameScene.swift 文件中调用它时,我都会收到 SIGABRT 消息,但我不知道为什么.我尝试仅使用 println() 消息调用该函数并且它起作用了.

I double checked the segue name and it is correct. Whenever I call this in my GameScene.swift file I get the SIGABRT message and I don't know why. I tried calling the function with only a println() message and it worked.

关于为什么会发生这种情况以及如何成功调用 GameScene.swift 文件中的方法的任何建议将不胜感激.

Any advice on why this is occurring and how I can successfully call the method in the GameScene.swift file would be greatly appreciated.

谢谢!

附言这是崩溃日志:

2015-01-28 21:59:46.181 RunawaySquare[95616:3907041] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver (<RunawaySquare.GameViewController: 0x7fe4305c7890>) has no segue with identifier 'GameEnd''
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010d461f35 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010f39ebb7 objc_exception_throw + 45
    2   UIKit                               0x000000010e20dd3b -[UIViewController shouldPerformSegueWithIdentifier:sender:] + 0
    3   RunawaySquare                       0x000000010d2683b2 _TFC13RunawaySquare18GameViewController8gameOverfS0_FT_T_ + 914
    4   RunawaySquare                       0x000000010d261af0 _TFC13RunawaySquare9GameScene12touchesBeganfS0_FTCSo5NSSet9withEventCSo7UIEvent_T_ + 1808
    5   RunawaySquare                       0x000000010d261c3f _TToFC13RunawaySquare9GameScene12touchesBeganfS0_FTCSo5NSSet9withEventCSo7UIEvent_T_ + 79
    6   SpriteKit                           0x000000010df4d7e1 -[SKView touchesBegan:withEvent:] + 946
    7   UIKit                               0x000000010e12d16e -[UIWindow _sendTouchesForEvent:] + 325
    8   UIKit                               0x000000010e12dc33 -[UIWindow sendEvent:] + 683
    9   UIKit                               0x000000010e0fa9b1 -[UIApplication sendEvent:] + 246
    10  UIKit                               0x000000010e107a7d _UIApplicationHandleEventFromQueueEvent + 17370
    11  UIKit                               0x000000010e0e3103 _UIApplicationHandleEventQueue + 1961
    12  CoreFoundation                      0x000000010d397551 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    13  CoreFoundation                      0x000000010d38d41d __CFRunLoopDoSources0 + 269
    14  CoreFoundation                      0x000000010d38ca54 __CFRunLoopRun + 868
    15  CoreFoundation                      0x000000010d38c486 CFRunLoopRunSpecific + 470
    16  GraphicsServices                    0x000000011480e9f0 GSEventRunModal + 161
    17  UIKit                               0x000000010e0e6420 UIApplicationMain + 1282
    18  RunawaySquare                       0x000000010d26cbee top_level_code + 78
    19  RunawaySquare                       0x000000010d26cc2a main + 42
    20  libdyld.dylib                       0x000000010fb8a145 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

它说没有segue id.与GameEnd"但有一个,如果在视图控制器上使用它可以工作

it says there is no segue id. with "GameEnd" but there is one and it works if used on the viewcontroller

推荐答案

这不起作用的原因是您正在创建 GameViewController 的新实例,然后您正在调用 gameOver 在那.您真正想要做的是引用您现有的 GameViewController

the reason this doesnt work is that you are creating a NEW instance of GameViewController and then you're calling gameOver on that. What you really want to do is reference your existing GameViewController

有几种方法可以做到这一点,我举一个例子.

theres a few ways to do this, I'll give you one example.

将 viewController 属性添加到您的 GameScene 类

class GameScene {

    // we need to make sure to set this when we create our GameScene
    var viewController: GameViewController!

在您的 GameViewController 文件中

// after GameScene is instantiated
gameScene.viewController = self

现在我们有了对 viewController 的引用,让我们在 GameScene 类中使用它

// somewhere in GameScene
self.viewController.gameOver()

这篇关于如何在 GameScene 中从 ViewController 调用方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆