InsertRowsAtIndexPaths: withAnimation: throws NSRangeException

This is my code (from the Core Data tutorial):

[eventsArray insertObject:event atIndex:0]; NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

The third line throws an exception:

 2011-05-12 13:13:33.740 Locations[8332:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 0 beyond bounds for empty array' *** Call stack at first throw: ( 0 CoreFoundation 0x010145a9 __exceptionPreprocess + 185 1 libobjc.A.dylib 0x01168313 objc_exception_throw + 44 2 CoreFoundation 0x0100a0a5 -[__NSArrayM objectAtIndex:] + 261 3 UIKit 0x0010d5b3 -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] + 6156 4 UIKit 0x000fcd36 -[UITableView insertRowsAtIndexPaths:withRowAnimation:] + 56 5 Locations 0x00003462 -[RootViewController addEvent] + 690 

I am new to iPhone development and I do not understand what this means. I am inserting a null index on a tableView, so I have no idea why it does not work with an empty array. Please explain this to me


stacktrace

eventsArray is an array that I populate the table view from (maybe at least it is used in cellForRowAtIndexPath )


 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // A date formatter for the time stamp. static NSDateFormatter *dateFormatter = nil; if (dateFormatter == nil) { dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setTimeStyle:NSDateFormatterMediumStyle]; [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; } // A number formatter for the latitude and longitude. static NSNumberFormatter *numberFormatter = nil; if (numberFormatter == nil) { numberFormatter = [[NSNumberFormatter alloc] init]; [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; [numberFormatter setMaximumFractionDigits:3]; } static NSString *CellIdentifier = @"Cell"; // Dequeue or create a new cell. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; } Event *event = (Event *)[eventsArray objectAtIndex:indexPath.row]; cell.textLabel.text = [dateFormatter stringFromDate:[event creationDate]]; NSString *string = [NSString stringWithFormat:@"%@, %@", [numberFormatter stringFromNumber:[event latitude]], [numberFormatter stringFromNumber:[event longitude]]]; cell.detailTextLabel.text = string; return cell; } 
+4
source share
4 answers

There was the same problem. You just need to tell the table view that it has 1 section to add. By default, it is 0 if you do not update it.

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. return 1; } 
+3
source

Can you check the data source used to load the table view? It appears in an empty array.

0
source

It seems to me that your eventArray is full and working, but updating on the tableview data source is not working properly. Could this mean that the data source is not configured properly, or maybe your datasource tableview methods return incorrect values?

What is the code for the following methods in your subclass? (assuming you are correctly following the UITableViewDataSource protocol).

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; 
0
source

Try adding this to viewdidLoad in your controller:

 eventsArray = [[NSMutableArray alloc] init]; 
0
source

All Articles