【swiftアプリ開発】複数のシーンを一つのviewcontrollerで扱ったらつまずいた。【delegate編】
シーン切り替えとDelegate
今回は一つのviewcontrollerで複数のシーンを表示していて、いつもと違うことをしたせいで約5時間ほど足止めを食らった( *`ω´)
きっかけはランキングボタンとツイッターボタンがうまく動かないとこから・・・
またいつものようにランキングが動作せずにエラーが出ているんでそれが原因と思いきや、ツイッターボタンも動かず。
なんだかんだやっているとdelegateの処理が実行されていなかったようです。
でもちゃんと書くものは書いていたので原因がわからず。ゲームセンターは相変わらずエラーが出っぱなしなので余計に辛い
インスタンスについてよく理解していなかったのが原因!?
私の中でdelegateの実装は、
scene.delegate = self
というのをview controllerに描き忘れなければ大体うまくいっていました。ですが今回はinitialScene,gameScene,gameOverSceneと複数のシーンを一つのview controllerで扱っていたためにこんがらがっていたんですね。
流れ的にはinitialScene → gameScene → gameOverScene
そこでgameOverSceneにdelegateを実装しようとした時に、とりあえずviewcontrollerに新しくgameOverSceneのインスタンスを作ってgameOverScene.delegate = self を記述、これだけで動くと勘違いしていました。
でも実際にはgameSceneでgameOverSceneのインスタンスを新たに作って遷移しているので、上記の記述は全くの無関係だったということなのかな!?
そこらへんを全然理解していなかったので無関係のところまで修正して、新たにネットで仕入れた素晴らしい知識を台無しにしてしまったよ( *`ω´)
とりあえず最終的には、シーンの遷移も個別に行わずにdelegateを使ってviewcontrollerで管理して、そこで精製するシーンごとにdelegateの記述をしたらちゃんと動きました
override func viewDidLoad() { super.viewDidLoad() var scene = GameScene() skView = self.view as! SKView scene.size = skView.frame.size scene.scaleMode = .AspectFill scene.changeDelegate = self skView.presentScene(scene) } func backToTitle() { self.performSegueWithIdentifier("Back", sender: self) } func changeGameScene() { var scene = GameScene() scene.changeDelegate = self scene.size = self.view.frame.size skView.presentScene(scene) } func changeGameClearScene() { var scene = GameOverScene(size: self.view.frame.size, won: true) scene.changeDelegate = self skView.presentScene(scene) } func changeGameOverScene() { var scene = GameOverScene(size: self.view.frame.size, won: false) scene.changeDelegate = self skView.presentScene(scene) }
なんか一つ問題が解消できたから満足したけど、今日は全く進歩していないどころか余計なことして問題を生み出していただけなのでむしろマイナスなんだよな(´Д` )
相変わらずゲームセンターエラーが出てるし・・・一体なぜ毎回こんなにも躓くのだろうか( *`ω´) たぶんituneconnectの方の設定をミスっている気がするんだけどな・・・まぁスマブラやってから考えよ