Фатальная ошибка: неожиданно найден ноль при развертывании необязательных значений [дубликат]
этот вопрос уже есть ответ здесь:
я использовал 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
}
кто-нибудь знает о это?
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 все контроллеры представления, назначенные одному и тому же классу, должны ссылаться на код, который у вас есть, иначе вы получите ошибку. Если у вас есть два разных контроллера вида с разным кодом, назначьте их разным классам. Это сработало для меня и, надеюсь, относится к тому, что вы делаете.
фатальная ошибка: неожиданно обнаружил нулю при разворачивании необязательное значение
- Проверьте коллекцию 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