So i'm trying to update a cell with incoming image. I have a protocol which calls back corresponding method when image DLing done. UITable's source is an NSArray of objects "Meeting". Every Meeting holds its table cell's indexPath which i get at a -
(UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
Meeting * meeting = [tableDataSource objectAtIndex:indexPath.row];
... cell's init code
meeting.cellPath = indexPath; // also tried [indexPath copy];
...
}
the problem is when I'm trying to update cell with stored IndexPath Im getting a strange error which says about some NSMutable array which I don't have:
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'
so its Index array out of bounds exception. By I don't have any NSMutableArray which has 3 elements. All my arrays r much bigger. Ah, exception comes out from here:
- (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];
}
this callback method gets called every time meeting image DLing has been done. And if I'll just comment the code line with reloadRowsAtIndexPaths - everything works just fine. Otherwise I'm getting error. What could it be at all? I spent a lot of hours but it's useless... I just don't have a glue what is all about...
And whats even more strange the issue comes always with 5th element :) when I'm scrolling the table's contents up. And there is nothing special with 5th element, I already tried it with another dataset but issue persist.
updated:
Error/crash happens only when code calls back the download:(Meeting *)meeting didFailWithError
method. But still it has same meeting parameter which I send to the downloadDidFinishDownloading
. I also tried following:
- (void)download:(Meeting *)meeting didFailWithError:(NSError *)error{
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:meeting.cellPath] withRowAnimation:UITableViewRowAnimationNone];
meeting.delegate = nil;
}
so app now crashes only in this method at reloadRowsAtIndexPaths.
An idea is that you might need to update your datasource object "tableDataSource" especially number of rows in section
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
edit :
Reading further your question, can you copy paste the "reusable cell" part in cellForRowAtIndexPath (in fact the whole method, i guess problem is located in there)
I believe your data source is having problems. With all the code is hard to say where is the problem.. Altought i have a tip for you, that might be useful for you. On the breakpoint tab on Xcode, click the plus button on the left down corner and a window will pop up, click on Done.
Run your app again, now when it crashes, it will point for you where in the code the app is breaking...
I don't know if you already have it.. but still!
Try this:
[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:meeting.cellPath] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]
User contributions licensed under CC BY-SA 3.0