Swift 如何从SKScene获取和更改视图控制器中的变量

Swift 如何从SKScene获取和更改视图控制器中的变量,swift,sprite-kit,skscene,skview,Swift,Sprite Kit,Skscene,Skview,好的,这是代码 class GameViewController: UIViewController, SceneTransitionDelegate, GKGameCenterControllerDelegate, ADBannerViewDelegate { var coolbool:Bool = false ...abunch of unimportant stuff functions and stuff } 下面是我在我的场景中要做的 func thing1() {

好的,这是代码

class GameViewController:  UIViewController,  SceneTransitionDelegate, 
GKGameCenterControllerDelegate, ADBannerViewDelegate {

var coolbool:Bool = false

...abunch of unimportant stuff functions and stuff

 }
下面是我在我的场景中要做的

func thing1()
{
        let controller = GameViewController()
        controller.coolbool = true
        println(controller.coolbool) // Will say that it is true
        sceneDelegate.transitionToScene(Menu.self) //Menu.self is the skscene that
       we used to be in and will be in
}

func thing2()
{
        println(controller.coolbool) // Will say that it is false
        if (controller.coolbool == true)
        {
           //Put rainbows over every sprite and change generator settings
        }
}
所以基本上,“coolbool”被初始化为false。直到调用thing1()导致变量“coolbool”更改。我确认了它在过渡之前的变化。然而,在转换之后(到同一场景(如果bool为真,我试图使它看起来不同)),如果你问它的值是什么,它会说它为假。。。。即使我只是把它设定为真

不管怎样,我认为我做错了什么,他们是更好的方法吗???如果你需要,这里是转换函数

func transitionToScene(sceneClass:Scene.Type) {
    playing = false
    var sizeRect = UIScreen.mainScreen().applicationFrame
    var width = sizeRect.size.width * UIScreen.mainScreen().scale
    var height = sizeRect.size.height * UIScreen.mainScreen().scale
    let skView = self.view as! SKView
    let scene = sceneClass(size: skView.bounds.size)
    scene.size = CGSizeMake(width, height)
    rwidth = width
    rheight = height
    swidth = width
    sheight = height
    skView.ignoresSiblingOrder = true

    scene.scaleMode = .AspectFill
    scene.sceneDelegate = self

    skView.presentScene(scene)
}

您需要获取GameViewController的当前实例,因此以下语句:

let controller = GameViewController()
因为它声明了一个与当前使用的
SKView
无关的控制器的新实例,所以无法工作。相反,我们需要获取当前视图控制器

获取视图控制器的实例:

var currentViewController: GameViewController?
var upstreamResponder: UIResponder? = self.view
var found = false

while (found != true){
    upstreamResponder = upstreamResponder!.nextResponder()
    if let viewController = upstreamResponder as? GameViewController {
        currentViewController = viewController
        found = true
    }
    if upstreamResponder == nil {
        //could not find VC, PANIC!
        break
    }
}
这里可以帮助我们的最接近的方法是
UIResponder
类,它是
nextResponder:
。它的一般功能是找到并返回当前的下一个响应者,这对我们来说似乎很模糊,也没有多大用处,直到苹果提到:

子类必须重写此方法以设置下一个响应程序。UIView通过返回管理它的UIViewController对象(如果有)或其superview(如果没有)来实现此方法

这意味着如果我们在场景中,我们可以通过使用场景的
self.view
找到视图控制器,该视图是呈现的
SKView
对象(继承自
UIView
)。我们所要做的就是在响应器链中找到视图控制器

Swift:

var currentViewController: GameViewController?
var upstreamResponder: UIResponder? = self.view
var found = false

while (found != true){
    upstreamResponder = upstreamResponder!.nextResponder()
    if let viewController = upstreamResponder as? GameViewController {
        currentViewController = viewController
        found = true
    }
    if upstreamResponder == nil {
        //could not find VC, PANIC!
        break
    }
}
目标-C:(可能必须包含“GameViewController.h”)

在视图控制器上设置属性

现在您有了当前的视图控制器,设置任何所需的属性都非常简单。因此,如果您想更改
coolbool
,只需声明:

currentViewController.coolbool = true

希望这有帮助
-Max

声明让controller=GameViewController()超出你的方法thing1()@jtband我真傻!这和coolbool是一样的,我重命名了它的所有实例,除了那一个,我只是想让人们容易阅读。