gpt4 book ai didi

ios - 调用协议(protocol)方法时出现 "fatal error: unexpectedly found nil while unwrapping an Optional value"

转载 作者:行者123 更新时间:2023-11-28 11:16:40 24 4
gpt4 key购买 nike

我已经实现了一个协议(protocol)来获取某种消息,游戏已经完成并将时间传递给我的 Controller (在 SpriteKit 中编写的游戏)。但是现在我在完成游戏并执行 gameEnded 方法后遇到了这个 fatal error ,应用程序崩溃了。有谁知道为什么?

这是我的代码

游戏 View Controller

class AcceleratorGameController: UIViewController {

var time: Float = 0.0
var challengeController: ChallengeViewController!
weak var delegate : GameEnded?

override func viewDidLoad() {
super.viewDidLoad()
if let scene = AcceleratorGame.unarchiveFromFile("AcceleratorGame") as? AcceleratorGame {

let skView = self.view as! SKView
skView.showsFPS = true
scene.viewController = self

skView.ignoresSiblingOrder = true

scene.scaleMode = .AspectFill
skView.presentScene(scene)
}
}


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var dest : ChallengeViewController = segue.destinationViewController as! ChallengeViewController
dest.gameHasFinished(time) //Dont know if this does anything...
println("Segue now!")
}

override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(true)
println("View will disapear")

delegate.gameHasFinished(self.time) // ###CRASHES HERE!###
}

这是我的另一个 ViewController

protocol GameEnded : class {
func gameHasFinished(time: Float)
}

class ChallengeViewController : UIViewController, GameEnded {

var time : Float = 0.0
var acceleratorGameController : AcceleratorGameController!

override func viewDidLoad() {
super.viewDidLoad()
println("ChallengeViewController geladen")
startGame()
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "accelGame" {
acceleratorGameController = segue.destinationViewController as! AcceleratorGameController
acceleratorGameController.delegate = self
}
}
func startGame () {
println("Start Game")

self.showAccelGameView()
}
func gameHasFinished(time: Float) {
println("Game has finished")
self.time = time
}
func showAccelGameView() {

println("Show Accel Game")
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("AcceleratorGameController") as! AcceleratorGameController

self.navigationController?.pushViewController(vc, animated: true)
}

编辑:我做了你告诉我的所有事情,但它仍然在同一点崩溃。 Xcode 告诉我使用委托(delegate)。我什么时候做委托(delegate)?它有效,但这不是我想要的。必须调用该函数!

func gameOver(time: Float) {
println("Game Over")
self.time = time
//delegate!.gameHasFinished(time) still crashes here. added !. i commented it to test the prepareForSegue method
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var dest : ChallengeViewController = segue.destinationViewController as! ChallengeViewController
dest.gameHasFinished(time)
println("Segue now!") // Wont happen
self.navigationController?.popViewControllerAnimated(true) //Wont happen either. If i call this in gameOver() it works.
}

我在 prepareForSegue() 方法中加入了一些 println(),但不知何故它们不会被执行。我必须以某种方式给他们打电话吗?这是我的 segue 的屏幕截图。

http://i.stack.imgur.com/oK4Ce.png

我也试过以相反的方式加入一个 segue,但这也无济于事。

http://i.stack.imgur.com/TVmdP.png (没有标识符,因为它是唯一的 segue。)

我忘了说这个 AcceleratorGameController 背后的 SpriteKit Game 在完成时会调用 gameOver() 方法。

最佳答案

首先,一些提示:

  • 始终尝试以下列方式声明您的协议(protocol)(当引用委托(delegate) 模式时):

    protocol GameEnded : class {
    func gameHasFinished(time: Float)
    }

    通过上述方式,您可以声明您的delegate 变量weak 并避免强引用。

  • 你的类 weak var 应该是这样的:

    class AcceleratorGameController: UIViewController {

    weak var delegate : GameEnded?

    // rest of your code
    }

最后,您应该保留一个引用作为类 AcceleratorGameController 的全局变量,以在 prepareForSegue 中设置为您的delegate,像下面这样:

class ChallengeViewController : UIViewController, GameEnded {

var acceleratorGameController : AcceleratorGameController!

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "accelGane" {
acceleratorGameController = segue.destinationViewController as! AcceleratorGameController
acceleratorGameController.delegate = self
}
}
}

上面的代码应该可以解决您的问题。希望对您有所帮助。

关于ios - 调用协议(protocol)方法时出现 "fatal error: unexpectedly found nil while unwrapping an Optional value",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31253925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com