ルート ビュー コントローラー -> ゲーム ビュー コントローラーからセグエしてから、gameviewcontroller でゲームプレイの skscene を表示し、別の skscene (ゲーム オーバー シーン) に移動してから、ルート ビュー コントローラーにセグエグを解除してから、繰り返します。問題は、2 回目にゲーム ビュー コントローラーにセグエしようとすると、ゲーム ビュー コントローラーが skscene (ゲームプレイ) を表示しようとした後に exc_bad_access がスローされることです。スタックトレースはなく、appdelegate の最初の行に exc_bad_access があるだけです。ゾンビでインストゥルメントを実行すると、アプリはエラーをスローせず、意図したとおりに動作します。例外ブレークポイントを設定しても何も起こらないようです。私のエラーがどこにあるのか、何が原因なのかわかりません。
これは私のルートView Controllerです:
class RootViewController: UIViewController {
//view that we present
@IBOutlet weak var MyLabel: UILabel?
var preload = true
override func viewDidLoad() {
super.viewDidLoad()
if preload {
textures.atlas.preloadWithCompletionHandler( {
print("finished preloading")
})
}
}
var lives: Int = 3
@IBOutlet weak var MyStepper: UIStepper!
@IBAction func didChangeValue(sender: UIStepper) {
lives = Int(sender.value)
MyLabel?.text = "lives: \(Int(sender.value).description)"
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
originalLives = lives
enemyLives = lives
heroLives = lives
print("seguing")
}
@IBAction func goBack(unwindSegue: UIStoryboardSegue) {
preload = false
}
}
//Controls a /view/ that displays scenes.
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//initialize the scene to fill screen
let myScene = GameScene(size: self.view.bounds.size)
myScene.scaleMode = .AspectFill
let theskView = self.view as! SKView
self.view.multipleTouchEnabled = true
// theskView.frameInterval = 2
//
// theskView.showsPhysics = true
// theskView.showsFPS = true
// theskView.showsNodeCount = true
// theskView.showsDrawCount = true
theskView.ignoresSiblingOrder = true
myScene.scaleMode = .AspectFill
myScene.size = theskView.bounds.size
myScene.controller = self
theskView.presentScene(myScene)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let dvc = segue.destinationViewController as? RootViewController {
}
}
deinit {
print("game view dies")
}
}
シーンは簡単です: これは (最初の skscene から) ゲーム オーバー シーンに移動するために呼び出されます
func gameOver(won: String) {
self.removeAllChildren()
let sceneToGoTo = GameOverScene()
sceneToGoTo.won = won == "nudgit" ? true : false
let theskView = self.view! as SKView
theskView.multipleTouchEnabled = true
// theskView.frameInterval = 2
theskView.ignoresSiblingOrder = true
sceneToGoTo.scaleMode = .AspectFill
sceneToGoTo.size = theskView.bounds.size
sceneToGoTo.controller = controller
theskView.presentScene(nil)
theskView.presentScene(sceneToGoTo)
}
そして、タッチからゲームオーバー シーンが続きます。
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
controller?.performSegueWithIdentifier("segue", sender: self)
}
どこの「コントローラー?」ゲームビューコントローラーの弱い変数です
deinits を確認しました。両方のゲーム シーンが正しく初期化解除されており、gameViewController がルート ビュー コントローラーに巻き戻すときに正しく初期化解除されています。これを修正するために何ができるか途方に暮れています。