He visto esto suceder cada vez que giro una pantalla que tiene un UITableView
en él. Descubrí que sucede entre las llamadas al método willRotate
y didRotate
en UIViewController
Mis compañeros de trabajo también lo han visto en otros lugares, por lo general en torno a la rotación. No había empezado a suceder hasta hace muy poco, y estamos perplejos en cuanto a cómo debemos lidiar con eso (las búsquedas de Google no muestran el mensaje de error en su forma exacta). ¿Alguien más ha encontrado esto que sepa qué hacer al respecto?¿Qué causa este error? "La posición de CALayer contiene NaN: [240 nan]"
Respuesta
He encontrado el problema.
Cuando restablece el marco de tableview
, llama al método de delegado tableView:heightForRowAtIndexPath:
para cada fila en la tabla para que pueda volver a calcular su tamaño de contenido si es necesario. En ese punto, hacemos un manejo especial para devolver la altura, y debido a algunas suposiciones erróneas en nuestro código, erróneamente devolvimos NaN
debido a un error de división por cero (la variable que dividimos por suponía que nunca sería cero). Asegurándonos de que no dividimos por cero aquí lo solucionamos.
(decidido tomar esto de los comentarios y ponerlo como una respuesta, ya que creo que es una buena respuesta zurcido :)
Ja! También tuve un cálculo de NaN (div0). Ayuda clave para la depuración: el mensaje en cuestión es emitido por NSLog(), por lo tanto, establezca un punto de interrupción en NSLog() y observe lo que el sistema operativo está haciendo en ese momento. Para mí, fue myUISlider.value = NaN.
Para establecer punto de interrupción:
XCode 3.x
- CMD-SHIFT-Y (ventana de depuración.)
- botón de puntos de interrupción.
- "doble clic para el símbolo"
- Type en "NSLog" (sin comillas.)
XCode 4.x
- CMD-6 (puntos de interrupción del navegador.)
- "+" para agregar punto de corte (abajo a la izquierda)
- Seleccionar AGREGAR SÍMBOLO DE PUNTO DE PARTIDA.
- Símbolo: NSLog
- Confirmar: Listo.
XCode 5.x - 7.1 (al menos) (Igual que 4.x, salvo los puntos de interrupción del navegador es CMD-7, ahora.)
aplicación Ejecutar, ver que se rompa en NSLog, revisa los rastros de la pila.
Esta es la respuesta que realmente importa cuando se trata de esta excepción. Es importante notar que esta excepción puede surgir de los componentes que usan CALayer y los usuarios de la API desconocemos su existencia (gracias a la encapsulación). – Pacu
¿Qué tal 5.1 - 6.0? – Morkrom
Morkrom, estás pensando en la versión de iOS. Estoy hablando de la versión XCode. Todavía no he tenido la oportunidad de comprobar XCode 5.x, pero apuesto a que no es muy difícil de entender. – Olie
he tenido este problema cuando se suponía que:
tableView:heightForHeaderInSection:
devolvió un NSInteger
, pero vuelve CGFloat
...
cambiante:
-(NSInteger)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
a
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
fijo mi problema.
Editar:
En algún momento me di cuenta de cómo funcionan los ordenadores por debajo del nivel C, así que pensé que iba a compartir que ... (voy a utilizar un registro de nombres de x86_64 que estoy más familiarizado con ellos , ARM sería ligeramente diferente pero similar)
int f(){
float someFloat=5.0f;
return someFloat;
}
como resultado la conversión del valor de someFloat
a un tipo entero luego copiar que a un registro particular: %rax
luego llamar la instrucción de retorno.
float f(){
float someFloat=5.0f;
return someFloat;
}
resultados en copiar el valor de someFloat
desde su ubicación actual a un registro particular: %xmm0
continuación, llamando a la instrucción de retorno.
Así que si tiene el prototipo incorrecto, el código de llamada esperará que el valor esté en el lugar equivocado, terminará realmente devolviendo un valor de basura.
He pasado un día tratando de encontrar el código que causa el mismo problema y lo resolví en unos minutos después de habilitar "excepción de interrupción" en Xcode. Consulte this tutorial para ver cómo habilitarlo.
¿Puede incluir un breve resumen del contenido de la página? Esto es para que los futuros lectores de esta publicación puedan obtener la información que buscan rápida y fácilmente. – gobernador
@gobernador ¡Lo haré ya que me acaba de ayudar! Para encontrar la línea exacta donde murió su aplicación, vaya a la pestaña de punto de interrupción a la izquierda de xcode, haga clic en +, agregue un nuevo 'Punto de interrupción de excepción' y deje la configuración predeterminada. Haga clic en Listo y vuelva a ejecutar su aplicación. – spamoom
Este error también me ha costado mucho tiempo.
Al final me encontré con mi colega escribió algo como esto:
UIEdgeInsets a;
a.left = (...some calculation);
button.imageEdgeInsets = a;
Y Reescribí estos códigos como este y solucionar el problema:
UIEdgeInsets a;
a.left = (...some calculation);
a.top = 0;
a.bottom = 0;
a.right = 0;
button.imageEdgeInsets = a;
algún valor de UIEdgeInsets no se ha inicializado correctamente, y a veces se convierte en un valor NaN y bloquea la aplicación.
Más en general, debe verificar si todos los valores de las estructuras de estilo C se inicializan correctamente.
- 1. posición CALayer contiene NaN: [nan -0,5]
- 2. Cómo resolver CALayerInvalidGeometry ', razón:' La posición de CALayer contiene NaN: [nan nan]?
- 3. UITableView crash da 'CALayerInvalidGeometry', razón: 'La posición de CALayer contiene NaN: [160 nan]'
- 4. CALayerInvalidGeometry ', razón:' CALayer bounds contiene NaN: [0 0; nan nan] crash in view
- 5. ¿NaN es igual a NaN?
- 6. ¿NaN negativo no es un NaN?
- 7. En Java, ¿qué significa NaN?
- 8. enviando NaN en json
- 9. Utilidad de la señalización NaN?
- 10. Reventado silencioso NaN
- 11. Usando NaN en C++?
- 12. Numpy integer nan
- 13. Canvas.GetTop() devolviendo NaN
- 14. ver número NaN
- 15. JavaScript: ¿qué es NaN, Object o primitive?
- 16. fundición NAN flotadores a int
- 17. ¿Cómo hago la prueba de NaN?
- 18. Obtener un NaN negativo en g ++ 4.4.3, ¿es este estándar?
- 19. Comprobación de nan en Cython
- 20. Confusión sobre NaN en Java
- 21. ExtJS 3.3 Format.Util.Ext.util.Format.dateRenderer volver NaN
- 22. encontrar valores NaN es matriz de células
- 23. fila retirar con valor nan
- 24. NaN magia constante en Java
- 25. Date.parse() da como resultado NaN
- 26. Determine si NSNumber es NaN
- 27. python nan and inf values
- 28. Comprobando si un número complejo tiene NaN
- 29. ¿Qué es NaNi, y cómo es diferente de NaN?
- 30. Formateando un flotador nan en python
estoy recibiendo el mismo error (tanto la posición y límites contener NaN, Mensajes por lo general vienen en pares.) Solo justo antes de que se muestre mi vista. Sin rotación, sin tablas, sin cálculos sofisticados. Una simple vista en gris oscuro con una etiqueta, "Procesando ..." y un indicador de progreso. ¿Alguien más tiene ideas sobre esta? – Olie
pon algunos puntos de interrupción en tus métodos viewdidload/viewwillappear y asegúrate de no dividir por cero en ningún lugar accidentalmente. – Kevlar
Puede o no ser relevante, pero he visto este bloqueo de forma mucho más consistente en Mavericks OSX 10.9, sin embargo no se volvió a ver después de la actualización de OSX 10.9.2. –