error with scrollToRowAtIndexPath

C.Johns picture C.Johns · Jan 18, 2012 · Viewed 11.3k times · Source

I am getting an error when using my application that used tableviews, the error looks like this.

2012-01-19 10:19:51.442 bcode[1176:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]: row (3) beyond bounds (3) for section (0).'
*** First throw call stack:
(0x16c3052 0x1920d0a 0x166ba78 0x166b9e9 0x68a136 0x3bfdf 0x6c2fbf 0x6c32d4 0x6c35d7 0x6d2666 0x87890e 0x878c17 0x878c86 0x62c499 0x62c584 0x2718e00 0x13614f0 0x15fa833 0x15f9db4 0x15f9ccb 0x1d05879 0x1d0593e 0x5fba9b 0x2838 0x2795 0x1)
terminate called throwing an exception(gdb) 

NSRangeException, -[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]
row (3) beyond bounds (3) for section (0).

What is happening is that when the user drills down my navigation view they can select a cell from the tableview of each view, which later will be used to build a search string.

However I allow them to go back and change their selection if they made an error.. this error happens when the user changes the value of the parent view then going into the subview only if the previous selection was outside the number of entries in the current tableview..

normally this wouldn't be a big problem however, inside viewDidAppear I am calling a method that scrolls to the previously selected cell... which obviously is what is breaking the app and giving me the error.

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    //Scroll to previously selected value
    [self.tableView scrollToRowAtIndexPath:oldCheckedIndexPath  atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}

how can I stop this from executing I have tried about a 100 different if statments in the parent view and the subview catching the new indexpath and checking agains oldselected indexpaths then setting

oldCheckedIndexPath = nil;

however somehow it always manages to mess up anyway.

Answer

mvds picture mvds · Jan 18, 2012

The clean way, assuming self is the tableView datasource:

Check the number of sections in the tableview:

if ( [self numberOfSectionsInTableView:self.tableView]
                                     > oldCheckedIndexPath.section 

and check the number of rows in that section:

  && [self tableView:self.tableView numberOfRowsInSection:
          oldCheckedIndexPath.section] > oldCheckedIndexPath.row )
   {
      [self.tableView scrollToRowAtIndexPath: // etc etc etc

Or, the quick hack:

@try {
    [self.tableView scrollToRowAtIndexPath: // etc etc etc 
}
@catch ( NSException *e )
{
    NSLog(@"bummer: %@",e);
}