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



этот вопрос уже есть ответ здесь:



я использовал 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
}


кто-нибудь знает о это?



Screenshot for warning on Console

541   13  

13 ответов:

почти наверняка, ваш идентификатор повторного использования "title" - это неправильно.

мы можем видеть из UITableView.h сигнатура метода dequeueReusableCellWithIdentifier что возвращаемый тип-это Неявно Развернул Необязательно:

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 говорит нам:

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

эти виды опций определяются как неявно развернутые Факультативный. Вы пишете неявно развернул необязательно по размещение восклицательный знак (строка!) а не вопросительный знак (строка?) после тип, который вы хотите сделать необязательным.

Итак, в основном, что-то, что могло бы быть нулем в какой-то момент, но с какого-то момента никогда не будет нулем снова. Поэтому мы избавляем себя от некоторых хлопот, принимая его как развернутую ценность.

это имеет смысл в данном случае для dequeueReusableCellWithIdentifier чтобы вернуть такое значение. Предоставленный идентификатор должно быть, уже привыкли зарегистрируйте ячейку для повторного использования. укажите неверный идентификатор, dequeue не может найти его, и среда выполнения возвращает ноль, который никогда не должен произойти. Это фатальная ошибка, приложение падает, и вывод консоли дает:

fatal error: unexpectedly found nil while unwrapping an Optional value

итог: проверьте идентификатор повторного использования ячейки, указанный в поле .раскадровка, Xib или в коде, и убедитесь, что это правильно при снятии очереди.

вы можете предотвратить аварию, безопасно развернув cell.labelTitle С if let заявление.

if let label = cell.labelTitle{
    label.text = "This is a title"
}

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

проверьте, если ячейка регистрируется с self.collectionView.registerClass(cellClass: AnyClass?, forCellWithReuseIdentifier identifier: String). Если да, то удалите эту строку кода.

посмотреть этот ответ для получения дополнительной информации: Почему выход UICollectionViewCell равен нулю?

" если вы используете раскадровку, вы не хотите называть это. Это будет перезаписать то, что у вас есть в раскадровке."

Я не знаю, это ошибка или что-то, но ваши метки и другие UIs не инициализируются автоматически при использовании пользовательской ячейки. Вы должны попробовать это в вашем UICollectionViewController класса. Это сработало для меня.

override func viewDidLoad() {
    super.viewDidLoad()

    let nib = UINib(nibName: "<WhateverYourNibName>", bundle: nil)
    self.collectionView.registerNib(nib, forCellReuseIdentifier: "title")
}

замените эту строку cell.labelTitle.text = "This is a title"
с cell.labelTitle?.text = "This is a title"

я получил его ошибку, когда я пытался получить доступ UILabel. Я забыл подключить UILabel до IBOutlet в раскадровке, и это вызвало сбой приложения с этой ошибкой!!

У меня тоже была эта проблема, и проблема была в контроллерах вида. Я не уверен, как ваше приложение структурировано, поэтому я просто объясню, что я нашел. Я довольно новичок в xcode и кодировании, так что потерпите меня.

Я пытался программно изменить текст на UILabel. С помощью "собственной личности.что mylabel.текст " работал нормально, пока я не добавил другой контроллер вида под тем же классом, который также не включал эту метку. Именно тогда я получил ошибку, которую вы видите. когда я добавил тот же UILabel и подключил его к этому дополнительному контроллеру представления, ошибка исчезла.

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

фатальная ошибка: неожиданно обнаружил нулю при разворачивании необязательное значение

  1. Проверьте коллекцию IBOutlet, потому что эта ошибка будет иметь шанс на использование несвязанного объекта uielement.

:) надеется, что это поможет для некоторых борющихся людей .

Я сам искал решение этой проблемы. только моя проблема была связана с UITableViewCell не 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).

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

Я предполагаю, что ваш ярлык всегда должен быть там?

Итак, если вы следуете совету Коннора, это в основном означает, что если этот ярлык доступно, а затем использовать его. Если ваш стиль правильно настроен и идентификатор повторного использования соответствует одному набору в раскадровке, вам не нужно будет делать эту проверку, если вы не используете более одной пользовательской ячейки.

оператор Нил срастанию может быть использован в качестве хорошо.

rowName = rowName != nil ?rowName!.stringFromCamelCase():""

У меня была такая же проблема в Xcode 7.3. Мое решение состояло в том, чтобы убедиться, что мои клетки имели правильный повторное использование идентификаторов. Под стол посмотреть раздел установить ячейка табличного представления к соответствующему имени идентификатора, который вы используете в программе,убедитесь, что они соответствуют.

У меня была та же проблема, и причиной этого было то, что я пытался загрузить UIImage с неправильным именем. Перепроверьте .setImage(UIImage(named: "-name-" звонки и убедитесь, что имя введено правильно.

то же сообщение здесь, но с другой причиной. У меня был UIBarButton Это подтолкнуло к переходу. В Сеге не было идентификатора.

Comments

    Ничего не найдено.