Swift - 在 prepareForSegue 方法中使用 Switch 语句
Swift - Using Switch Statement in prepareForSegue method
我设置了以下 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")
尝试在将生成的 UIImage
分配给其 image
属性 之前强制(由于“!”)解包 resultImage
。
由于 resultImage
是一个 nil
,因此无论图像是否存在,您都会得到异常,因为它无法解包以访问其 image
属性 .
resultImage
必须在 运行 上面那行
之前初始化
更新:
此时,当您获得目标控制器时,它已被初始化,但由于尚未访问控制器的视图,因此仍未生成其出口(这会触发 viewDidLoad
和出口的初始化).
所以你可以:
将图像名称存储为目标控制器中的 属性 并在控制器的 viewDidLoad() 方法中设置图像
访问控制器的视图(即使只是阅读它)它会触发控制器的视图创建流程(不太确定这个,但我在某处读到它是可能的)
我设置了以下 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")
尝试在将生成的 UIImage
分配给其 image
属性 之前强制(由于“!”)解包 resultImage
。
由于 resultImage
是一个 nil
,因此无论图像是否存在,您都会得到异常,因为它无法解包以访问其 image
属性 .
resultImage
必须在 运行 上面那行
更新:
此时,当您获得目标控制器时,它已被初始化,但由于尚未访问控制器的视图,因此仍未生成其出口(这会触发 viewDidLoad
和出口的初始化).
所以你可以:
将图像名称存储为目标控制器中的 属性 并在控制器的 viewDidLoad() 方法中设置图像
访问控制器的视图(即使只是阅读它)它会触发控制器的视图创建流程(不太确定这个,但我在某处读到它是可能的)