我设置了以下switch语句,以处理3种不同的按钮水龙头:石头,纸张,剪刀。例如,点击Rock按钮,将带您到ResultViewController,并显示“rockSegue”信息。

每次我运行该应用程序,然后点击其中一个按钮(例如,岩石)时,当转换为ResultViewController时,它崩溃,并说当展开一个可选值时resultImage包含nil。它所引用的资产肯定存在,所以对于我在这里做错了什么,我有些卡住了?

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let controller = segue.destinationViewController as ResultViewController
    switch segue.identifier! {
    case "rockSegue":
        controller.resultImage!.image = UIImage(named: "PaperCoversRock")
        controller.resultLabel!.text = "You lose"...(continued)

该按钮包含以下代码:
  @IBAction func rockButton() {
    performSegueWithIdentifier("rockSegue", sender: self)
}

最佳答案

这行:

controller.resultImage!.image = UIImage(named: "PaperCoversRock")

在将生成的resultImage分配给UIImage属性之前,尝试强制(由于'!')解开image

由于resultImage在那时是nil,因此无论图像是否存在,您都将获得异常,因为无法解压缩图像以访问其image属性。

在运行上面的行之前,必须初始化resultImage
更新:

在这一点上,当您获得目标控制器时,它已被初始化,但由于尚未访问该控制器的视图(它触发了viewDidLoad和插座的初始化),因此尚未生成其出口。

因此,您可以:
  • 将图像名称作为属性存储在目标控制器中,并在控制器的viewDidLoad()方法中设置图像
  • 访问控制器的视图(甚至只是读取它),它将触发控制器的视图创建流程(虽然我可能在某处阅读,但不确定这一点)
  • 10-07 17:58