我是一个Swift初学者,我正在编写一个可以显示一系列内容的应用。当您点击其中一个时,您将获得有关它和照片的详细信息。但是,我遇到了一个问题 - 我有代码来显示图像,但是当我点击模拟器时它会崩溃。
应用崩溃时位于xcode底部的文字:
致命错误:在解包可选值时意外发现nil
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var detail = segue.destinationViewController as! detailSkinsViewController
detail.skinNameLabel = self.skin
if (self.skin == "AK47 | Wasteland Rebel") {
detail.skinImg.image = UIImage(named: "s495fn")
}
}
谢谢!
答案 0 :(得分:3)
您应该查看崩溃堆栈以查看实际行。有几个地方你可能遇到麻烦:
var detail = segue.destinationViewController as! detailSkinsViewController
如果destinationViewController
不属于detailSkinsViewController
类,则会请求崩溃。 (Swift类应该始终以大写字母开头。这也应该是let
,而不是var
。你永远不会修改它。)在这里使用if-let
会更安全。
detail.skinImg.image = UIImage(named: "s495fn")
目前还不清楚这些是什么,但是如果skinImg
是UIImageView!
,那么如果尚未加载目标NIB(可能),则会发生崩溃。出于这个原因,您通常不应该进入其他对象IBOutlets。 (对于IBOutlets,这也是使用?
而不是!
的一个很好的理由。这将导致“没有任何反应”,而不是崩溃。)
您应该在视图控制器本身上创建UIImage?
属性,而不是弄乱其他视图控制器出口。在didSet
中,如果视图已加载(UIImageView
),请更新isViewLoaded
。在viewDidLoad
期间,使用该属性初始化UIImageView
。通过这种方式,您可以为其他人设置一个明确的API来设置不公开内部子视图的图像(这是实现细节)。
举个例子:
class ViewController: UIViewController {
@IBOutlet private var imageView: UIImageView?
var image: UIImage? {
didSet(newImage) {
self.imageView?.image = newImage
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.imageView?.image = self.image
}
}
答案 1 :(得分:0)
当尝试解包一个根本没有值的可选变量的值时,通常会出现此错误。 首先检查可选变量并逐行调试,以查看是否有任何可选变量完全没有您尝试解包的值
答案 2 :(得分:0)
你应该检查你的可选值, 我没有看到你的皮肤变量定义,但我认为下面的代码将解决你的问题
Detailed Error Information:
Module IIS Web Core
Notification BeginRequest
Handler Not yet determined
Error Code 0x800700a1
Config Error Cannot read configuration file
Config File \\?\UNC\NAS1\SharedStorage\WebApplications\Default\www\http:\web.config
Requested URL http://localhost:80/http:/foo-bar.com
Physical Path \\NAS1\SharedStorage\WebApplications\Default\www\http:\foo-bar.com
Logon Method Not yet determined
Logon User Not yet determined