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

时间:2015-08-29 06:25:48

标签: swift sprite-kit skscene skview

好的,这是代码

class GameViewController:  UIViewController,  SceneTransitionDelegate, 
GKGameCenterControllerDelegate, ADBannerViewDelegate {

var coolbool:Bool = false

...abunch of unimportant stuff functions and stuff

 }

这就是我想从我的SKScene

做的事情
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”被初始化为假。直到调用thing1()导致变量“coolbool”发生变化。我在过渡之后立即确认了它的变化。然而在转换之后(到同一个场景(我试图让它看起来不同,如果bool是真的))如果你问这个值是什么,它就说它是假的....即使我只是把它设置为true

无论如何我认为我做错了什么,是他们更好的方法吗?你想要的就是过渡功能

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)
}

1 个答案:

答案 0 :(得分:0)

你需要获取GameViewController的当前实例,所以这个语句:

let controller = GameViewController()

不能正常工作,因为它声明了一个控制器的新实例,它与您当前使用的SKView无关。相反,我们需要获取当前,呈现视图控制器。

获取视图控制器的实例:

可以帮助我们的最接近的方法是UIResponder类,它是nextResponder:。它的一般功能是找到并返回当前的下一个响应者,这对我们来说似乎含糊不清,直到Apple提到:

  

子类必须覆盖此方法才能设置下一个响应者。 UIView通过返回管理它的UIViewController对象(如果有的话)或超级视图(如果没有)来实现此方法

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

<强>夫特:

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
    }
}

Objective-C:(可能需要#include&#34; GameViewController.h&#34;)

GameViewController *currentViewController;
UIResponder *upstreamResponder = self.view;
BOOL found = false;

while (found != true) {
    upstreamResponder = [upstreamResponder nextResponder];
    if ([upstreamResponder isKindOfClass:[GameViewController class]]) {
        currentViewController = (GameViewController *)upstreamResponder;
    }
    if (upstreamResponder == nil) {
        //omg where did VC go?!
        break;
    }
}

在View Controller上设置属性

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

currentViewController.coolbool = true

希望这有帮助!
-Max