初心者のSWIFTアプリ開発記 ©たぬきち

肥満気味になってきたので筋トレに励んでいます! プログラミング頑張ります

【swiftアプリ開発】複数のシーンを一つのviewcontrollerで扱ったらつまずいた。【delegate編】

シーン切り替えとDelegate

今回は一つのviewcontrollerで複数のシーンを表示していて、いつもと違うことをしたせいで約5時間ほど足止めを食らった( *`ω´)

きっかけはランキングボタンとツイッターボタンがうまく動かないとこから・・・
またいつものようにランキングが動作せずにエラーが出ているんでそれが原因と思いきや、ツイッターボタンも動かず。

なんだかんだやっているとdelegateの処理が実行されていなかったようです。

でもちゃんと書くものは書いていたので原因がわからず。ゲームセンターは相変わらずエラーが出っぱなしなので余計に辛い

f:id:egoisticYK:20151114041128p:plain

インスタンスについてよく理解していなかったのが原因!?

私の中で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の記述をしたらちゃんと動きましたf:id:egoisticYK:20151114040809p:plain

 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の方の設定をミスっている気がするんだけどな・・・まぁスマブラやってから考えよ