Неустранимая ошибка: неожиданно найден нуль при развертывании необязательных значений

Я использовал 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. В сегменте не было идентификатора.