Error fatal: inesperadamente se encontró nulo al desenvolver valores opcionales [duplicado]

Resuelto rulilg asked hace 54 años • 13 respuestas

Estaba usando un UICollectionViewen Swift pero aparece cuando intento cambiar el texto de la etiqueta de la celda.

    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
}

¿Alguien sabe sobre esto?

Captura de pantalla de advertencia en la consola

rulilg avatar Jan 01 '70 08:01 rulilg
Aceptado

Puede evitar que se produzca el bloqueo desenvolviendo de forma segura cell.labelTitlecon una if letdeclaración.

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

Aún así tendrás que hacer un poco de depuración para ver por qué obtienes un valor nulo allí.

Connor Pearson avatar Jul 09 '2014 00:07 Connor Pearson

Es casi seguro que su identificador de reutilización "title"sea incorrecto.

Podemos ver en la UITableView.hfirma del método dequeueReusableCellWithIdentifierque el tipo de retorno es un opcional implícitamente desenvuelto :

func dequeueReusableCellWithIdentifier(identifier: String!) -> AnyObject! // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.

Eso está determinado por el signo de exclamación después de AnyObject:

    AnyObject!

Entonces, lo primero que hay que considerar es: ¿qué es un "opcional implícitamente desenvuelto"?

El lenguaje de programación Swift nos dice:

A veces, de la estructura de un programa queda claro que un opcional siempre tendrá un valor, después de que ese valor se establezca por primera vez. En estos casos, es útil eliminar la necesidad de verificar y desencapsular el valor del opcional cada vez que se accede a él, porque se puede asumir con seguridad que tiene un valor todo el tiempo.

Este tipo de opciones se definen como opciones implícitamente desenvueltas. Se escribe un opcional implícitamente desenvuelto colocando un signo de exclamación (¡Cadena!) en lugar de un signo de interrogación (¿Cadena?) después del tipo que desea convertir en opcional.

Entonces, básicamente, algo que podría haber sido nulo en un momento dado, pero que a partir de algún momento nunca vuelve a ser nulo. Por lo tanto, nos ahorramos algunas molestias al aceptarlo como valor sin envolver.

En este caso tiene sentido dequeueReusableCellWithIdentifierdevolver dicho valor. El identificador proporcionado ya debe haberse utilizado para registrar la celda para su reutilización. Proporcione un identificador incorrecto, la cola no puede encontrarlo y el tiempo de ejecución devuelve un valor nulo que nunca debería suceder. Es un error fatal, la aplicación falla y el resultado de la consola muestra:

fatal error: unexpectedly found nil while unwrapping an Optional value

En pocas palabras: verifique el identificador de reutilización de su celda especificado en .storyboard, Xib o en el código, y asegúrese de que sea correcto al retirarlo de la cola.

Max MacLeod avatar Aug 11 '2014 09:08 Max MacLeod