Error fatal: inesperadamente se encontró nulo al desenvolver valores opcionales [duplicado]
Estaba usando un UICollectionView
en 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?
Puede evitar que se produzca el bloqueo desenvolviendo de forma segura cell.labelTitle
con una if let
declaració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í.
Es casi seguro que su identificador de reutilización "title"
sea incorrecto.
Podemos ver en la UITableView.h
firma del método dequeueReusableCellWithIdentifier
que 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 dequeueReusableCellWithIdentifier
devolver 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.