#ios #swift #cs193p
#iOS #swift #cs193p
Вопрос:
Я застрял в каком-то коде с ужасной ошибкой «Не удается развернуть Optional.None» в моем коде.
Я следую коду Shutterbug из курса iTunes U Стэнфордского университета.
Это код, приведенный в Objective-C для одного из классов.
и что я придумал в Swift;
После отслеживания ошибок, в частности, эти строки, похоже, вызывают у меня проблемы
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. попытался перезапустить его, проблема возникла со вчерашнего вечера, поэтому я не думаю, что это временная ошибка