【发布时间】:2019-12-23 12:15:50
【问题描述】:
我有一个简单的(多场景)spritekit 游戏,想使用 UITableViewContoller 实现和显示设置屏幕。我很接近,但是当我改变场景时,我一直失去对游戏视图控制器的引用,这意味着我只能在我的游戏开始时在第一个场景中继续使用 UITableViewController。我希望有人能帮忙。我在情节提要中设置了 UITableView,并从那里的 GameViewController 设置了对 tableview 的 segue。
我的 GameViewController 文件中有以下设置:
override func viewDidLoad() {
super.viewDidLoad()
if let view = self.view as! SKView? {
// Load the SKScene
if let scene = SKScene(fileNamed: "MenuScene") {
// Set the scale mode to scale to fit the window
scene.scaleMode = .aspectFill
//I'VE ADDED THIS
if let gameScene = scene as? MenuScene {
gameScene.viewController = self
}
// Present the scene
view.presentScene(scene)
}
view.ignoresSiblingOrder = true
}
}
func showSettings() {
performSegue(withIdentifier: "openSettings", sender: self)
}
这让我从我的 SKScene 中引用了 GameViewController。然后,当用户触摸 SKLabelNode 时,我在 spritekit 中从我的 SKScene 加载 UITableViewController。我的 MenuScene 代码的更简单版本如下所示:
class MenuScene: SKScene {
var viewController: GameViewController?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
let touch:UITouch = touches.first!
let positionInScene = touch.location(in: self)
let touchedNode = self.atPoint(positionInScene)
if let name = touchedNode.name
{
let transition:SKTransition = SKTransition.fade(withDuration: 0.75)
var scene:SKScene = SKScene()
if (name == "settingsBTN"){
viewController?.showSettings()
}
else if (name == "randomBTN"){
scene = StarScene(size: self.size)
scene.backgroundColor = SKColor.black
self.view?.presentScene(scene, transition: transition)
}
}
}
}//菜单场景结束
当我第一次开始游戏时点击设置 BTN 时,表格视图呈现良好。但是,如果我在我的游戏中访问另一个场景(例如,通过按 randomBTN)并返回菜单场景,我将无法再转到设置视图,因为我失去了对视图控制器的引用(它显示为 nil)所以我可以'不要在执行 segue 的 GameViewController 中调用 showSettings 方法(大概是因为我在视图控制器本身中设置了对视图控制器的引用)。
我不知道如何维护对我的 GameViewController 的引用,因此我可以随时显示设置屏幕。请有人帮忙。
【问题讨论】:
标签: swift uiviewcontroller sprite-kit