IBOutlet属性返回"无法解包Optional.None"错误

时间:2014-06-29 12:02:18

标签: ios swift cs193p

我的代码中出现了一些可怕的“无法解包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函数中并且收到了同样的错误。

2 个答案:

答案 0 :(得分:1)

准备segue时会调用此行:     ivc.imageURL = flickerFetcher.URLforPhoto(照片,格式:FlickrFetcher.FlickrPhotoFormat.Large)

在imageURL上调用setter:

set {
    self.startDownloadingImage()
}

startDownloadingImage()调用image上的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中,因此此时尚未加载视图控制器,并且所有出口都是零,因此无法解包Optional.none。

您需要重新构建程序的逻辑,以便它们在加载之前不会尝试使用插件。

答案 1 :(得分:0)

检查您的插座是否已连接。出口被定义为隐式展开的Optionals,因此如果您引用未设置的属性(例如,如果出口未连接),您可能会看到该错误

我已经下载了你的项目,并且出口出现了问题 - 在Xcode中,scrollview和spinner有点灰色。这是滚动视图和微调器出现在我身上的方式:

enter image description here

这意味着没有为当前选定的尺寸类安装项目。如果您转到该视图的属性检查器,请确保选中已安装选项对于你关心的尺寸等级:

enter image description here

在您的项目中,未检查顶部框(表示任何大小的类)。

然而,代码中存在更多问题,在本答案中无法详细介绍。你有几个导致问题的问题,包括(我确实在一段时间后放弃了):

  • 属性访问器中的无限循环 - 例如get的{​​{1}}闭包
  • 当您真正想要imageURL时实施setwillSet个闭包 - 例如,scrollView上的didSet会更好willSet,或者您应该使用didSet而不是newValue,因为在scrollView时,willSet仍然是scrollView
  • nil的值设置为nil属性,然后在该属性的setter块中访问它
  • 你的下载逻辑出现了一些奇怪的事情(此时,我决定称它为一天,对不起)