IBOutlet属性返回“Can not unwrap Optional.None”错误

我遇到了一些代码,在我的代码中带有可怕的“Can not unwrap Optional.None”错误。

我正在关注iTunes U斯坦福大学的Shutterbug代码。

这是Objective-C为其中一个类提供的代码。

http://pastebin.com/LG2k3BBW

和我在Swift中提出的一样。

http://pastebin.com/pGtSzu6z

在追查这些错误之后,这些线路似乎给我带来了问题

self.scrollView.zoomScale = 1.0 

 self.image = nil 

有什么问题在这里的任何意见?

我最初把所有的setter放在ViewDidLoad函数中,并且收到了同样的错误。

当你正在准备segue时,这行被调用:ivc.imageURL = flickerFetcher.URLforPhoto(photo,格式:FlickrFetcher.FlickrPhotoFormat.Large)

在imageURL上调用setter:

 set { self.startDownloadingImage() } 

startDownloadingImage()在图像上调用setter,这是你得到所有错误的地方:

 set{ self.imageView.image = image self.scrollView.zoomScale = 1.0 self.spinner.stopAnimating() self.imageView.frame = CGRectMake(0, 0, image!.size.width, image!.size.height) } 

由于所有这些都是在prepareForSegue中发生的,视图控制器在这一点上还没有被加载,所有的sockets都是零,因此不能解开Optional.none。

你需要重新调整你的程序的逻辑,以免它们在加载之前尝试使用sockets。

检查你的网点是否连接。 Outlet被定义为隐式的Unwrapped Optionals,所以如果你引用了一个没有设置的属性,你会期望看到这个错误(例如,如果sockets没有连接)

我已经下载了你的项目,并且网点出了问题 – 滚动视图和微调在Xcode中是灰色的。 这是scrollview和spinner如何显示给我的:

在这里输入图像说明

这意味着这些项目没有安装在当前选定的尺寸等级上。 如果您转到该视图的属性检查器,请确保select“ 已安装”选项以查看您关心的大小类别:

在这里输入图像说明

在您的项目中,顶部框(代表任何大小类)没有被选中。

但是,在代码中还有更多的问题,在这个答案中有太多的细节不足。 你有几个问题正在导致问题,包括(我放弃了一段时间后):

  • 你的属性访问器中的无限循环 – 例如, imageURLget闭包
  • 当你真正想要didSet时候实现set或者willSet闭包 – 例如, willSet上的willSet会更好didSet ,或者你应该使用newValue而不是scrollView ,因为在willSetscrollView仍然是nil
  • nil的值设置为image属性,然后在setter块中为该属性访问它
  • 在你的下载逻辑中出现了一些奇怪的事情(在这一点上,我决定把它叫做一天,对不起)