Error fatal: se encontró inesperadamente nulo mientras se desenvuelve un valor opcional

Estaba usando un UICollectionView en Swift pero me UICollectionView cuando trato de 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 para advertencia en la consola

Casi con certeza, su "title" identificador "title" identificador de reutilización es incorrecto.

Podemos ver desde la firma del método UITableView.h de dequeueReusableCellWithIdentifier que el tipo de retorno es un Opcionalmente Desempaquetado Opcionalmente :

 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 a considerar es, ¿qué es un “Opcionalmente Desempaquetado Implícitamente”?

El lenguaje de progtwigción Swift nos dice:

A veces es claro desde la estructura de un progtwig 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 desenvolver el valor de la opción cada vez que se acceda, ya que se puede suponer que tiene un valor todo el tiempo.

Este tipo de opciones se definen como opciones opcionales implícitamente desempaquetadas. Usted escribe una opción opcional implícitamente desenvuelta colocando un signo de exclamación (¡Cadena!) En lugar de un signo de interrogación (¿Cadena?) Después del tipo que desea que sea opcional.

Entonces, básicamente, algo que pudo haber sido nulo en un punto, pero que desde algún punto en adelante nunca vuelve a ser nulo. Por lo tanto, nos ahorramos un poco de molestia tomándolo como el valor desenvuelto.

En este caso, tiene sentido que dequeueReusableCellWithIdentifier devuelva dicho valor. El identificador proporcionado debe haberse utilizado ya para registrar la celda para su reutilización. Proporcione un identificador incorrecto, el dequeue no puede encontrarlo, y el tiempo de ejecución devuelve un valor nulo que nunca debería ocurrir. Es un error fatal, la aplicación se bloquea y la salida de la consola da:

 fatal error: unexpectedly found nil while unwrapping an Optional value 

En pocas palabras: compruebe 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 eliminar.

Puede evitar que se produzca el locking desenrollando cell.labelTitle forma cell.labelTitle con una instrucción if let .

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

Sin embargo, todavía tendrá que hacer algunas depuraciones para ver por qué está obteniendo un valor nulo allí.

Compruebe si la celda se está registrando con self.collectionView.registerClass(cellClass: AnyClass?, forCellWithReuseIdentifier identifier: String) . Si es así, elimine esa línea de código.

Consulte esta respuesta para obtener más información: ¿Por qué la salida de UICollectionViewCell es nula?

“Si estás usando un guión gráfico, no quieres llamarlo. Va a sobrescribir lo que tienes en tu guión gráfico”.

No sé si es un error o algo, pero sus tags y otras IU no se inicializan automáticamente cuando usa una celda personalizada. Debería probar esto en su clase UICollectionViewController . Funcionó para mí

 override func viewDidLoad() { super.viewDidLoad() let nib = UINib(nibName: "", bundle: nil) self.collectionView.registerNib(nib, forCellReuseIdentifier: "title") } 

Reemplace esta línea cell.labelTitle.text = "This is a title"
con cell.labelTitle?.text = "This is a title"

Recibí su error cuando estaba tratando de acceder a UILabel . ¡Olvidé conectar UILabel a IBOutlet en Storyboard y eso causó que la aplicación IBOutlet con este error!

Estaba teniendo este problema también y el problema estaba en los controladores de vista. No estoy seguro de cómo está estructurada su aplicación, así que solo explicaré lo que encontré. Soy bastante nuevo en xcode y encoding, así que tengan paciencia conmigo.

Intentaba cambiar el texto programáticamente en un UILabel. Usar “self.mylabel.text” funcionó bien hasta que agregué otro controlador de vista en la misma clase que no incluía esa etiqueta. Fue entonces cuando recibí el error que estás viendo. Cuando agregué el mismo UILabel y lo conecté a ese controlador de vista adicional, el error desapareció.

En resumen, parece que en Swift, todos los controladores de vista asignados a la misma clase tienen que hacer referencia al código que tiene allí, de lo contrario se obtiene un error. Si tiene dos controladores de vista diferentes con códigos diferentes, asígnelos a diferentes clases. Esto funcionó para mí y, con suerte, se aplica a lo que estás haciendo.

error fatal: encontrado inesperadamente nulo mientras desenvuelve un valor opcional

  1. Verifique la colección de IBOutlet, ya que este error tendrá la oportunidad de desconectar el uso del objeto uielement.

🙂 espera que ayude a algunas personas con problemas.

Busqué una solución para esto yo mismo. solo mi problema estaba relacionado con UITableViewCell Not UICollectionView como mencionas aquí.

En primer lugar, soy nuevo en el desarrollo de iOS. Como nuevo, sentado aquí tratando de llegar a través de mi primer tutorial, así que no tomes mi palabra para nada. (a menos que funcione;))

Estaba obteniendo una referencia nula a cell.detailTextLabel.text – Después de volver a ver el video tutorial que estaba siguiendo, no parecía que me hubiera perdido nada. Así que ingresé el archivo de cabecera para UITableViewCell y lo encontré.

var detailTextLabel: UILabel! { get } // default is nil. label will be created if necessary (and the current style supports a detail label).

Entonces me di cuenta de que dice (y el estilo actual es compatible con una etiqueta de detalle) – Bueno, el estilo personalizado no tiene una etiqueta detallada allí por defecto. así que solo tuve que cambiar el estilo de la celda en el guión gráfico, y todo estaba bien.

Supongo que tu etiqueta siempre debe estar ahí.

Entonces, si el siguiente consejo de Connor, eso significa básicamente, SI esa etiqueta está disponible, entonces úsala. Si su estilo está configurado correctamente y el identificador de reutilización coincide con el del conjunto de guiones gráfico, no debería tener que hacer esta comprobación a menos que use más de una celda personalizada.

Nil Coalescing Operator también se puede usar.

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

Tuve el mismo problema en Xcode 7.3. Mi solución fue asegurarme de que mis células tuvieran los identificadores de reutilización correctos. En la sección de la vista de tabla, configure la celda de la vista de tabla con el nombre del identificador correspondiente que está utilizando en el progtwig, asegúrese de que coincidan .

Estaba teniendo el mismo problema y la razón fue porque estaba tratando de cargar un UIImage con el nombre incorrecto. Vuelva a verificar .setImage(UIImage(named: "-name-" calls y asegúrese de que el nombre sea correcto).

El mismo mensaje aquí, pero con una causa diferente. Tuve un UIBarButton que impulsó una transición. El segue carecía de un identificador.