2011-01-27 6 views
18

Tengo una vista de tabla personalizada en mi aplicación. Implementé la característica "Cargar más" en la tabla que carga 25 filas a la vez. El problema es después de cargar 2 veces los bloqueos de la aplicación dando 'CALayerInvalidGeometry', razón: 'La posición de CALayer contiene NaN: [160 nan]' como error en OS 4.2 y superior.UITableView crash da 'CALayerInvalidGeometry', razón: 'La posición de CALayer contiene NaN: [160 nan]'

En el sistema operativo por debajo de 4.2 una de las celdas se pierde y hay un espacio en blanco entre en el medio de la tabla. No da ningún choque. Pero todavía da el error mencionado anteriormente.

Compruebo para ver dónde puede aparecer la división por 0 en mi código pero no pude encontrar ninguna. Siguiendo la pila trace i fond. Entonces ni siquiera puedo verificar dónde está ocurriendo esta excepción.

¿Alguien tiene alguna idea?

0 CoreFoundation      0x020ccbe9 __exceptionPreprocess + 185 
1 libobjc.A.dylib      0x022215c2 objc_exception_throw + 47 
2 CoreFoundation      0x02085628 +[NSException raise:format:arguments:] + 136 
3 CoreFoundation      0x0208559a +[NSException raise:format:] + 58 
4 QuartzCore       0x0182396a _ZL18CALayerSetPositionP7CALayerRKN2CA4Vec2IdEEb + 177 
5 QuartzCore       0x018238b5 -[CALayer setPosition:] + 42 
6 QuartzCore       0x018237cc -[CALayer setFrame:] + 763 
7 UIKit        0x0073c307 -[UIView(Geometry) setFrame:] + 255 
8 UIKit        0x008c718a -[UITableViewCell setFrame:] + 166 
9 UIKit        0x0077aa08 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 1160 
10 UIKit        0x0077077f -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75 
11 UIKit        0x00785450 -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1561 
12 UIKit        0x0077d538 -[UITableView layoutSubviews] + 242 
13 QuartzCore       0x01828451 -[CALayer layoutSublayers] + 181 
14 QuartzCore       0x0182817c CALayerLayoutIfNeeded + 220 
15 QuartzCore       0x0182137c _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310 
16 QuartzCore       0x018210d0 _ZN2CA11Transaction6commitEv + 292 
17 QuartzCore       0x018517d5 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99 
18 CoreFoundation      0x020adfbb __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27 
19 CoreFoundation      0x020430e7 __CFRunLoopDoObservers + 295 
20 CoreFoundation      0x0200bbd7 __CFRunLoopRun + 1575 
21 CoreFoundation      0x0200b240 CFRunLoopRunSpecific + 208 
22 CoreFoundation      0x0200b161 CFRunLoopRunInMode + 97 
23 GraphicsServices     0x02611268 GSEventRunModal + 217 
24 GraphicsServices     0x0261132d GSEventRun + 115 
25 UIKit        0x0071542e UIApplicationMain + 1160 
+0

tengo el mismo problema – krasnyk

+0

Cuál es extraño es que este error ocurre sólo en la fila 43 de la tabla. Descanse todas las filas se muestran bien. – Tarang

+0

Este problema me está haciendo perder mucho sueño, ¿alguien tiene buenas ideas? – marchinram

Respuesta

21

El seguimiento de la pila parece que el UITableView está ocupado diseñando las celdas visibles cuando se produce la excepción. Dado que la posición de una celda parece establecerse en un valor NaN, uno tiene que preguntarse cómo puede suceder esto.

Suponiendo que no haya errores en el código de diseño de UITableView, la única forma de que esto ocurra es implementar tableView:heightForRowAtIndexPath: en su delegado de vista de tabla y devolver una altura incorrecta (o uno de los métodos de encabezado o pie de página).

Editar para determinar la causa exacta de la excepción:

Asumo que ha calculado la altura de la celda del tamaño geométrica de una cadena (usando UIStringDrawing 's -[NSString sizeWithFont:]). Cuando envía un mensaje a un valor nulo, el valor de retorno generalmente es nulo, 0, NO, o cualquier valor representado por una palabra de todos los bits cero.

Para un método que devuelve una estructura (como sizeWithFont:) esto no es cierto. La estructura devuelta no se inicializa en absoluto, y contiene valores aleatorios para sus elementos.

En su caso, probablemente utilizó uno de los elementos no inicializados de la estructura CGSize, que más tarde resultó no ser un valor de punto flotante IEEE 754 válido.

Addendum: Desde clang 3.0 las estructuras devueltas de los mensajes se inicializan a {0} (todos los bits son cero). Así que el problema anterior no debería suceder más.

+0

Implemento el tableView: heightForRowAtIndexPath: para devolver alturas de fila personalizadas, pero no estoy seguro de cómo puede devolver una altura incorrecta. ¿Puedes profundizar en eso? – marchinram

+0

su derecho que tiene que hacer con el método tableView: heightForRowAtIndexPath: lo comenté y funciona bien ahora y no se cuelga. Pero para mi aplicación, necesito poder cambiar dinámicamente las alturas de fila para adaptarme al contenido. ¿Tienes alguna sugerencia de cómo puedo hacer esto y devolver un buen valor para que no se cuelgue? – marchinram

+0

ok cool Lo tengo, resulta que no estaba buscando una cuerda nula que estaba arruinando la altura gracias, te recompensaré cuando me deje entrar 3 horas – marchinram

27

Tuve este mismo error exacto ya que en vez de escribir

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { ... } 

i escribió:

- (NSInteger)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { ... } 

(notar el valor de retorno). Espero que esto ayude a alguien.

+0

Usted acaba de hacer mi día – clopez

+2

He perdido todo mi día .. Ahora finalmente resuelto el problema .. Gracias @Moszi – Rupesh

+0

Gracias! ¡Esto también me salvó! ¡Si solo hubiera visto esto antes! –

2

La respuesta simple:

La devolución de un NaN de cualquiera de los métodos de delegado relacionados altura provoca este error.

tableView:heightForRowAtIndexPath: 
tableView:heightForHeaderInSection: 
tableView:heightForFooterInSection: 

etc.

Puede haber otras formas de producir este error, pero si está trabajando con UITableView: ¡consulte esto primero!

0

Para mí fue causado por el toView en este código es nula:

[UIView transitionFromView:self.fromView 
         toView:self.toView 
         duration:0.6 
         options:(currentPage > toPage ? UIViewAnimationOptionTransitionCurlDown : UIViewAnimationOptionTransitionCurlUp) 
        completion:^(BOOL finished) { 
         if (finished) { 
         } 
        }