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是一样的,我重命名了它的所有实例,除了那一个,我只是想让人们容易阅读。