2012-07-20 15 views
5

Quindi sto cercando di aggiornare una cella con l'immagine in arrivo. Ho un protocollo che richiama il metodo corrispondente quando l'immagine DLing è terminata. La fonte di UITable è un NSArray di oggetti "Meeting". Ogni incontro detiene indexPath del suo cella di una tabella che ottengo in un -iphone UITable reloadRowsAtIndexPaths problema molto strano

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

il problema è quando sto cercando di aggiornare cella con memorizzati IndexPath Im ottenendo uno strano errore che dice su alcune serie NSMutable che non mi avere:

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' 

quindi l'array di indice fuori eccezione dei limiti. Non ho alcun NSMutableArray che abbia 3 elementi. Tutti i miei array sono molto più grandi. Ah, l'eccezione viene fuori da qui:

- (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]; 
} 

questo metodo di richiamata viene richiamato ogni volta che si incontra l'immagine della riunione. E se mi limiterò a commentare la riga di codice con reloadRowsAtIndexPaths - tutto funziona bene. Altrimenti sto ricevendo errore. Cosa potrebbe essere? Ho passato un sacco di ore ma è inutile ... Non ho una colla tutto ciò che riguarda ... E il problema è ancora più strano con il quinto elemento :) quando sto scorrendo i contenuti del tavolo su. E non c'è nulla di speciale con il quinto elemento, l'ho già provato con un altro set di dati, ma il problema persiste.

aggiornato: Errore/arresto anomalo si verifica solo quando il codice richiama il metodo download:(Meeting *)meeting didFailWithError. Ma ha ancora lo stesso parametro di incontro che invio allo downloadDidFinishDownloading. Ho anche provato seguente:

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

così app ora si blocca solo in questo metodo reloadRowsAtIndexPaths.

+0

perché stai ricaricare la riga se il download non è riuscito? qualcosa cambia nella fila? – moxy

+0

sì, ferma e nasconde lo spinner e rende visibile UILabel che dice "DL err" – Stan

risposta

0

Un'idea è che si potrebbe aver bisogno di aggiornare il tuo oggetto DataSource "tableDataSource" in particolare il numero di righe nella sezione

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

edit:

di proseguire ulteriormente la vostra domanda, si può copiare incollare il "riutilizzabile cella "parte in cellForRowAtIndexPath (in effetti l'intero metodo, credo che il problema si trovi lì)

+0

Non arriva quando si verifica un errore. È stato ricontrollato. Subito dopo l'arresto dell'app dell'applicazione reloadRowsAtIndexPaths. – Stan

+0

Anche il mio oggetto datasource "tableDataSource" è NSArray e non si aggiorna in alcun modo nel significato di aggiungere o rimuovere elementi. – Stan

0

Credo che la tua fonte di dati stia avendo problemi. Con tutto il codice è difficile dire dove sia il problema .. Altought ho un consiglio per te, che potrebbe essere utile per te. Nella scheda punto di interruzione su Xcode, fare clic sul pulsante più nell'angolo in basso a sinistra e verrà visualizzata una finestra, fare clic su Fine.

Eseguire nuovamente la vostra applicazione, ora quando si blocca, si punterà per voi dove nel codice dell'app è rottura ...

Non so se hai già .. ma ancora!

+0

il mio oggetto origine dati "tableDataSource" è NSArray e non si aggiorna in alcun modo nel significato di aggiungere o rimuovere elementi. – Stan

+0

Non è possibile modificare un contenuto NSArray, modificarlo in NSMutableArray .. e si è pronti per andare. – NSPunk

+0

Già provato b4 ma niente. inoltre non provo a cambiare il set di dati ma solo alcune proprietà degli oggetti contenuti – Stan

-1

Prova questo:

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