insertRowsAtIndexPaths:withAnimation: throws NSRangeException
This is my code (from a 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'm new to iPhone development, and I can't understand that does it mean. I'm inserting at the zero index of a tableView, so I have no idea why does not it work with an empty array. Please clarify this to me
eventsArray is an array I populate table view from (probably. 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:@"%@, %@",
[开发者_JS百科numberFormatter stringFromNumber:[event latitude]],
[numberFormatter stringFromNumber:[event longitude]]];
cell.detailTextLabel.text = string;
return cell;
}
Had the same problem. Just need to tell the tableview that it has 1 section to add too. It defaults to 0 if you don't update it.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
Can you please check the data source used to load the table view? It appears to an empty array.
It appears to me that your eventsArray is filled, and working, but the update on the tableview datasource doesn't work properly. This could mean that the datasource is not properly set, or perhaps your tableview datasource methods return wrong values?
What is the code behind the following methods in your subclass? (assuming you correctly conform to the UITableViewDataSource protocol).
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
Try adding this to the viewdidLoad in your controller:
eventsArray = [[NSMutableArray alloc] init];
精彩评论