IBOutlet property returning “Can't unwrap Optional.None” error

旧巷老猫 提交于 2019-12-24 08:24:14

问题


I'm getting stuck on some code with the dreaded "Can't unwrap Optional.None" error in my code.

I'm following the Shutterbug code from the iTunes U Stanford university course.

This is the code given in Objective-C for one of the classes.

http://pastebin.com/LG2k3BBW

and what I've come up with in Swift;

http://pastebin.com/pGtSzu6z

After tracing the errors these lines in particular seem to be giving me the problems

self.scrollView.zoomScale = 1.0

and

self.image = nil

Any advice on what's going wrong here?

I had originally put all the setters in the ViewDidLoad function and was receiving the same error.


回答1:


This line is called when you are preparing for segue: ivc.imageURL = flickerFetcher.URLforPhoto(photo, format: FlickrFetcher.FlickrPhotoFormat.Large)

Which calls the setter on imageURL:

set {
    self.startDownloadingImage()
}

startDownloadingImage() calls the setter on image which is where you get all of your errors:

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)
}

Since all of this is happening in prepareForSegue, the view controller hasn't been loaded at this point and all of the outlets are nil hence the can't unwrap Optional.none.

You need to restructure your program's logic so that it isn't trying to do stuff with outlets before they are loaded.




回答2:


Check your outlets are connected. Outlets are defined as implicitly unwrapped Optionals, so you'd expect to see that error if you referred to a property that wasn't set (e.g. If the outlet was not connected)

I've downloaded your project and there was a problem with the outlets - the scrollview and spinner were kind of grayed out in Xcode. Here's how the scrollview and spinner showed up for me:

This means that the items are not installed for the currently selected size class. If you go to the attributes inspector for that view, make sure the Installed option is checked for the size classes you care about:

In your project, the top box (representing any size class) was not checked.

However, there are many more problems within the code, too numerous to go into in full detail in this answer. You have several issues which are causing problems, including (I did give up after a while):

  • Infinite loops in your property accessors - for example, the get closure for imageURL
  • Implementing set or willSet closures when you actually want didSet - for example, the willSet on the scrollView would be better as a didSet, or you should be using newValue instead of scrollView, because at the point of willSet, scrollView is still nil.
  • Setting a value of nil to your image property, then accessing it in the setter block for that property
  • Something odd going on in your downloading logic (at this point, I decided to call it a day, sorry)


来源:https://stackoverflow.com/questions/24475889/iboutlet-property-returning-cant-unwrap-optional-none-error

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!