Неустранимая ошибка: неожиданно найден нуль при развертывании необязательных значений
Я использовал UICollectionView
в Swift, но получаю, когда пытаюсь изменить текст метки ячейки.
func collectionView(collectionView: UICollectionView!, numberOfItemsInSection section: Int) -> Int
{
return 5
}
func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell!
{
var cell = collectionView.dequeueReusableCellWithReuseIdentifier("title", forIndexPath: indexPath) as TitleCollectionViewCell
// Next line: fatal error: unexpectedly found nil while unwrapping an Optional value
cell.labelTitle.text = "This is a title"
return cell
}
Кто-нибудь знает об этом?
![Снимок экрана для предупреждения на консоли]()
Ответы
Ответ 1
Скорее всего, ваш идентификатор повторного использования "title"
неверен.
Из подписи UITableView.h
метода dequeueReusableCellWithIdentifier
видно, что тип возвращаемого значения - Неявно Unwrapped Необязательный:
func dequeueReusableCellWithIdentifier(identifier: String!) -> AnyObject! // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.
Это определяется восклицательным знаком после AnyObject
:
AnyObject!
Итак, первое, что нужно учитывать, это что-то вроде "неявно развязанного"?
Язык Swift для программирования сообщает нам:
Иногда из структуры программ видно, что необязательный всегда имеет значение, после этого значение сначала устанавливается. В этих случаях это полезно удалить необходимость проверки и разворачивания значения опций каждый раз, когда к нему обращаются, поскольку можно с уверенностью предположить, что значение все время.
Эти типы опций определяются как неявно развернутые ДОПОЛНИТЕЛЬНО. Вы пишете неявно разворачиваемую опцию, помещая восклицательный знак (String!), а не знак вопроса (String?) после тип, который вы хотите сделать необязательным.
Итак, в основном, что-то, что могло быть ничто в какой-то момент, но с какой-то точки никогда больше не будет ник. Поэтому мы избавляем себя от беспокойства, принимая его в качестве развернутого значения.
В этом случае имеет смысл вернуть dequeueReusableCellWithIdentifier
такое значение. Приведенный идентификатор должен быть уже использован для регистрации ячейки для повторного использования. Поставьте неверный идентификатор, dequeue не сможет его найти, а время выполнения возвращает нуль, которого никогда не должно было случиться. Это фатальная ошибка, приложение вылетает, а выход Console дает:
fatal error: unexpectedly found nil while unwrapping an Optional value
Нижняя строка: проверьте идентификатор повторного использования вашей ячейки, указанный в .storyboard, Xib или в коде, и убедитесь, что он прав при удалении.
Ответ 2
Вы можете предотвратить возникновение сбоя, безопасно развернув cell.labelTitle
с помощью оператора if let
.
if let label = cell.labelTitle{
label.text = "This is a title"
}
Вам все равно придется выполнить некоторую отладку, чтобы понять, почему вы получаете нулевое значение.
Ответ 3
Проверьте, зарегистрирована ли ячейка с помощью self.collectionView.registerClass(cellClass: AnyClass?, forCellWithReuseIdentifier identifier: String)
. Если да, то удалите эту строку кода.
См. этот ответ для получения дополнительной информации:
Почему выход UICollectionViewCell отсутствует?
"Если вы используете раскадровку, вы не хотите называть это, она перезапишет то, что у вас есть в вашем раскадровке".
Ответ 4
Я не знаю, это ошибка или что-то еще, но ваши метки и другие пользовательские интерфейсы не инициализируются автоматически при использовании пользовательской ячейки. Вы должны попробовать это в своем классе UICollectionViewController
. Это сработало для меня.
override func viewDidLoad() {
super.viewDidLoad()
let nib = UINib(nibName: "<WhateverYourNibName>", bundle: nil)
self.collectionView.registerNib(nib, forCellReuseIdentifier: "title")
}
Ответ 5
Заменить эту строку
cell.labelTitle.text = "This is a title"
с
cell.labelTitle?.text = "This is a title"
Ответ 6
Я получил свою ошибку, когда пытался получить доступ к UILabel
. Я забыл подключить UILabel
к IBOutlet
в Storyboard, и это привело к сбою приложения с этой ошибкой!
Ответ 7
У меня тоже была эта проблема, и проблема была в контроллерах view. Я не уверен, как ваше приложение структурировано, поэтому я просто объясню, что я нашел. Я новичок в кодировании и кодировании, поэтому несите меня.
Я пытался программным образом изменить текст на UILabel. Использование "self.mylabel.text" работало нормально, пока я не добавил еще один контроллер представления в тот же класс, который также не включал эту метку. То есть, когда я получил ошибку, которую вы видите. Когда я добавил тот же UILabel и подключил его к этому дополнительному контроллеру представления, ошибка исчезла.
Короче говоря, кажется, что в Swift все контроллеры представлений, назначенные одному классу, должны ссылаться на код, который у вас есть, или вы получаете ошибку. Если у вас есть два разных контроллера представлений с различным кодом, назначьте их различным классам. Это сработало для меня и, надеюсь, относится к тому, что вы делаете.
Ответ 8
фатальная ошибка: неожиданно найден nil при развертывании необязательного значения
- Проверьте коллекцию IBOutlet, потому что эта ошибка будет иметь шанс отключить использование объекта uielement.
:) надеется, что это поможет некоторым борющимся людям.
Ответ 9
Я сам искал решение для этого. только моя проблема была связана с UITableViewCell Not UICollectionView в качестве упоминания здесь.
Во-первых, я новичок в разработке iOS. как новый, сидит здесь, пытаясь получить мой первый учебник, поэтому не забудь ни слова. (если только он не работает;))
Я получал нулевую ссылку на cell.detailTextLabel.text
- после переучивания учебного видео, которое я читал, он не выглядел так, будто я пропустил что-либо. Поэтому я ввел заголовочный файл для UITableViewCell и нашел это.
var detailTextLabel: UILabel! { get } // default is nil. label will be created if necessary (and the current style supports a detail label).
Итак, я заметил, что он говорит (и текущий стиль поддерживает метку детали). Ну, пользовательский стиль по умолчанию не имеет detailLabel. поэтому мне просто пришлось переключить стиль ячейки в раскадровке, и все было в порядке.
Предполагаю, что ваш ярлык всегда должен быть там?
Итак, если ваш следующий совет по конфору, это в основном означает, что если этот ярлык доступен, используйте его. Если ваш стиль правильно настроен, а идентификатор повторного использования совпадает с тем, который установлен в раскадровке, вам не нужно выполнять эту проверку, если вы не используете более одной настраиваемой ячейки.
Ответ 10
Также может использоваться оператор коалесцирования Nil.
rowName = rowName != nil ?rowName!.stringFromCamelCase():""
Ответ 11
У меня была такая же проблема на Xcode 7.3. Мое решение состояло в том, чтобы убедиться, что у моих ячеек есть правильные идентификаторы повторного использования. В разделе таблицы > установите ячейку представления таблицы в соответствующее имя идентификатора, которое вы используете в программе, убедитесь, что они соответствуют.
Ответ 12
У меня была одна и та же проблема, и причина этого была в том, что я пытался загрузить UIImage с неправильным именем. Выполните двойную проверку вызовов .setImage(UIImage(named: "-name-"
и убедитесь, что имя верное.
Ответ 13
То же сообщение здесь, но с другой причиной. У меня был UIBarButton
, который толкнул segue. В сегменте не было идентификатора.