2012-07-20 18 views
5

Así que estoy tratando de actualizar una celda con la imagen entrante. Tengo un protocolo que devuelve la llamada al método correspondiente cuando se realiza la imagen DLing. La fuente de UITable es un NSArray de objetos "Reunión". Cada reunión tiene indexPath de su celda de la tabla, que me sale en una -iphone UITable reloadRowsAtIndexPaths problema muy extraño

(UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    Meeting * meeting = [tableDataSource objectAtIndex:indexPath.row]; 
... cell's init code 
    meeting.cellPath = indexPath; // also tried [indexPath copy]; 
... 
} 

el problema es cuando estoy tratando de actualizar celular con almacenada IndexPath Im conseguir un extraño error que dice acerca de algunas matriz NSMutable que no lo hago tener:

2012-07-20 20:15:18.007 MyNewbieApp[5734:207] meeting.cellPath = [row = 2,section = 0] 
2012-07-20 20:15:18.705 MyNewbieApp[5734:207] meeting.cellPath = [row = 4,section = 0] 
2012-07-20 20:15:18.728 MyNewbieApp[5734:207] meeting.cellPath = [row = 5,section = 0] 
2012-07-20 20:15:18.730 MyNewbieApp[5734:207] downloadDidFinishDownloading <NSIndexPath 0x79456f0> 2 indexes [0, 5] 
2012-07-20 20:15:18.732 MyNewbieApp[5734:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 3 beyond bounds [0 .. 2]' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x02c70b99 __exceptionPreprocess + 185 
    1 libobjc.A.dylib      0x02a6540e objc_exception_throw + 47 
    2 CoreFoundation      0x02c66695 -[__NSArrayM objectAtIndex:] + 261 
    3 UIKit        0x00556327 -[_UITableViewUpdateSupport(Private) _setupAnimationsForExistingVisibleCells] + 264 
    4 UIKit        0x00555b9b -[_UITableViewUpdateSupport initWithTableView:updateItems:oldRowData:newRowData:oldRowRange:newRowRange:context:] + 436 
    5 UIKit        0x003ab5d6 -[UITableView(_UITableViewPrivate) _updateWithItems:withOldRowData:oldRowRange:newRowRange:context:] + 1323 
    6 UIKit        0x003a7f03 -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] + 9179 
    7 UIKit        0x003974d3 -[UITableView reloadRowsAtIndexPaths:withRowAnimation:] + 56 
    8 MyNewbieApp       0x00017354 -[MeetingsVC downloadDidFinishDownloading:] + 174 
    9 MyNewbieApp       0x000173a6 -[MeetingsVC download:didFailWithError:] + 43 
    10 MyNewbieApp       0x00010e5f -[Meeting image] + 317 
    11 MyNewbieApp       0x00016f49 -[MeetingsVC tableView:cellForRowAtIndexPath:] + 2141 
    12 UIKit        0x0039ed6f -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 619 
    13 UIKit        0x00394e02 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75 
    14 UIKit        0x003a9774 -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1561 
    15 UIKit        0x003a17ec -[UITableView layoutSubviews] + 242 
    16 QuartzCore       0x02619481 -[CALayer layoutSublayers] + 177 
    17 QuartzCore       0x026191b1 CALayerLayoutIfNeeded + 220 
    18 QuartzCore       0x026122e0 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 302 
    19 QuartzCore       0x02612040 _ZN2CA11Transaction6commitEv + 292 
    20 QuartzCore       0x02642ebb _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99 
    21 CoreFoundation      0x02c51f4b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27 
    22 CoreFoundation      0x02be6b27 __CFRunLoopDoObservers + 295 
    23 CoreFoundation      0x02bafce7 __CFRunLoopRun + 1575 
    24 CoreFoundation      0x02baf350 CFRunLoopRunSpecific + 208 
    25 CoreFoundation      0x02baf271 CFRunLoopRunInMode + 97 
    26 GraphicsServices     0x0318000c GSEventRunModal + 217 
    27 GraphicsServices     0x031800d1 GSEventRun + 115 
    28 UIKit        0x0033baf2 UIApplicationMain + 1160 
    29 MyNewbieApp       0x00002034 main + 102 
    30 MyNewbieApp       0x00001fc5 start + 53 
) 
terminate called after throwing an instance of 'NSException' 

por lo que su matriz de índice de excepción fuera de los límites. Por no tengo NSMutableArray que tenga 3 elementos. Todas mis matrices son mucho más grandes. Ah, la excepción sale de aquí:

- (void)downloadDidFinishDownloading:(Meeting *)meeting 
    { 
     NSLog(@"downloadDidFinishDownloading %@",meeting.cellPath); 
     //NSLog(@"downloadDidFinishDownloading meeting.cellPath = [row = %d,section = %d]",meeting.cellPath.row,meeting.cellPath.section); 

     [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:meeting.cellPath] withRowAnimation:UITableViewRowAnimationNone]; 
     meeting.delegate = nil; 
    } 

- (void)download:(Meeting *)meeting didFailWithError:(NSError *)error{ 
    [self downloadDidFinishDownloading:meeting]; 
} 

este método de devolución de llamada se invoca cada vez que se ha realizado la reunión de la imagen DLing. Y si solo voy a comentar la línea de código con reloadRowsAtIndexPaths, todo funciona bien. De lo contrario, recibo un error. ¿Qué podría ser? Pasé muchas horas pero es inútil ... Simplemente no tengo pegamento. Todo es cuestión de ... Y lo que es aún más extraño, el problema viene siempre con el quinto elemento :) cuando estoy desplazando el contenido de la tabla arriba. Y no hay nada especial con el 5 ° elemento, ya lo intenté con otro conjunto de datos, pero el problema persiste.

actualizado: El error/bloqueo ocurre solo cuando el código devuelve la llamada al método download:(Meeting *)meeting didFailWithError. Pero aún tiene el mismo parámetro de reunión que envío al downloadDidFinishDownloading. También probé siguiente:

- (void)download:(Meeting *)meeting didFailWithError:(NSError *)error{ 
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:meeting.cellPath] withRowAnimation:UITableViewRowAnimationNone]; 
      meeting.delegate = nil; 
} 

tan aplicación se bloquea sólo en este método en reloadRowsAtIndexPaths.

+0

¿por qué volver a cargar la fila si la descarga no? ¿Algo cambió en la fila? – moxy

+0

sí, detiene y oculta la ruleta y hace visible UILabel que dice "DL err" – Stan

Respuesta

0

Una idea es que es posible que tenga que actualizar el objeto de origen de datos "tableDataSource", especialmente el número de filas en la sección

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

edición:

de seguir leyendo su pregunta, se puede copiar y pegar el "reutilizable cell "part en cellForRowAtIndexPath (de hecho, todo el método, supongo que el problema está localizado allí)

+0

No llega cuando ocurre un error. Ha sido verificado dos veces. Justo después de la descarga de la aplicación ReloadRowsAtIndexPaths. – Stan

+0

También mi objeto de origen de datos "tableDataSource" es NSArray y no se actualiza de ninguna manera en el sentido de agregar o eliminar elementos. – Stan

0

Creo que su fuente de datos está teniendo problemas. Con todo el código es difícil decir dónde está el problema. Al contrario, tengo un consejo para ti, que podría ser útil para ti. En la pestaña del punto de interrupción en Xcode, haga clic en el botón más en la esquina inferior izquierda y aparecerá una ventana emergente, haga clic en Listo.

Ejecutar la aplicación de nuevo, ahora cuando se rompe, apuntará para usted en qué parte del código de la aplicación se está rompiendo ...

No sé si ya lo tienes .. pero todavía!

+0

mi objeto de origen de datos "tableDataSource" es NSArray y no se actualiza de ninguna manera en el sentido de agregar o eliminar elementos. – Stan

+0

No puede cambiar un contenido de NSArray, cambiarlo a NSMutableArray ... y ya está listo. – NSPunk

+0

Ya lo probé b4 pero nada. además, no trato de cambiar el conjunto de datos, sino solo algunas propiedades de los objetos contenidos – Stan

-1

Prueba esto:

[self.tableView beginUpdates]; 
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:meeting.cellPath] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView endUpdates] 
Cuestiones relacionadas