Свойство IBOutlet возвращает ошибку «Не удается развернуть необязательно.Нет»

#ios #swift #cs193p

#iOS #swift #cs193p

Вопрос:

Я застрял в каком-то коде с ужасной ошибкой «Не удается развернуть Optional.None» в моем коде.

Я следую коду Shutterbug из курса iTunes U Стэнфордского университета.

Это код, приведенный в Objective-C для одного из классов.

http://pastebin.com/LG2k3BBW

и что я придумал в Swift;

http://pastebin.com/pGtSzu6z

После отслеживания ошибок, в частности, эти строки, похоже, вызывают у меня проблемы

 self.scrollView.zoomScale = 1.0
  

и

 self.image = nil
  

Любой совет о том, что здесь происходит не так?

Я изначально поместил все параметры настройки в функцию viewDidLoad и получал ту же ошибку.

Комментарии:

1. Убедитесь, что выход ScrollView подключен..

2. @Yatheesha определенно подключен

3. Можете ли вы поделиться образцом?

4. Каков наилучший способ сделать это?

5. Github или Dropbox лучше всего подходят для совместного использования проекта

Ответ №1:

Эта строка вызывается при подготовке к переходу: ivc.ImageUrl = flickerFetcher.URLforPhoto (фотография, формат: FlickrFetcher.Формат FlickrPhotoFormat.Большой)

Который вызывает установщик в ImageUrl:

 set {
    self.startDownloadingImage()
}
  

startDownloadingImage() вызывает установщик для изображения, где вы получаете все свои ошибки:

 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.

Вам необходимо реструктурировать логику вашей программы, чтобы она не пыталась что-то делать с выходами до их загрузки.

Ответ №2:

Проверьте, подключены ли ваши розетки. Розетки определяются как неявно развернутые опции, поэтому вы ожидаете увидеть эту ошибку, если вы ссылались на свойство, которое не было установлено (например, если розетка не была подключена)

Я загрузил ваш проект, и возникла проблема с выходами — scrollview и spinner были выделены серым цветом в Xcode. Вот как для меня появились scrollview и spinner:

введите описание изображения здесь

Это означает, что элементы не установлены для текущего выбранного класса размеров.Если вы перейдете к инспектору атрибутов для этого представления, убедитесь, что установленный параметр отмечен для классов размеров, которые вас интересуют:

введите описание изображения здесь

В вашем проекте верхний ящик (представляющий любой класс размера) не был отмечен.

Однако в коде есть еще много проблем, слишком много, чтобы вдаваться в подробности в этом ответе. У вас есть несколько проблем, которые вызывают проблемы, в том числе (через некоторое время я сдался):

  • Бесконечные циклы в ваших средствах доступа к свойствам — например, get закрытие для imageURL
  • Реализация set willSet замыканий или, когда вы действительно хотите didSet — например, willSet в ScrollView было бы лучше, как didSet , или вы должны использовать newValue вместо scrollView , потому что в точке willSet , scrollView все еще nil .
  • Установка значения nil для вашего image свойства, затем доступ к нему в блоке setter для этого свойства
  • Что-то странное происходит в вашей логике загрузки (на данный момент я решил прекратить, извините)

Комментарии:

1. Определенно подключено, проверено много раз, у меня тоже есть activityIndicatorView, который, похоже, выдает мне ту же ошибку. Это тоже определенно связано

2. Как вы создаете контроллер представления? Если розетки подключены, но их нет при запуске, возможно, вы создаете экземпляр без доступа к указателю / раскадровке?

3. Контроллер представления был создан через раскадровку, и все было добавлено через это

4. Просто для развлечения попробуйте перезапустить Xcode. У меня было несколько проблем с бета-версией, когда изменения, похоже, не сохраняются без перезапуска. Вероятно, это не замечается, поскольку вы непроизвольно перезапускаете так много раз со всеми сбоями 😉

5. попытался перезапустить его, проблема возникла со вчерашнего вечера, поэтому я не думаю, что это временная ошибка