2010-06-11 11 views
41

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

24

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.

+0

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

+1

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

+0

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. –

35

(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.

+1

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

+0

¿Qué tal 5.1 - 6.0? – Morkrom

+0

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

12

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.

13

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.

+1

¿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

+2

@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

2

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.

0

Hay un otra manera de reproducir el problema: el uso de insetBy(dx:dy:) en un muy pequeño rect

enter image description here