Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

error with scrollToRowAtIndexPath

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.

like image 725
C.Johns Avatar asked Jan 18 '12 21:01

C.Johns


1 Answers

Inspired by the accepted answer:

Objective-C:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
if ([self numberOfSectionsInTableView:self.tableView] > indexPath.section && [self tableView:self.tableView numberOfRowsInSection:indexPath.section] > indexPath.row) {
    [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

Swift:

let indexPath = IndexPath(row: rowToScroll, section: sectionToScroll) 
if (self.tableView.numberOfSections > indexPath.section && self.tableView.numberOfRows(inSection: indexPath.section) > indexPath.row ) {
    self.tableView.scrollToRow(at: IndexPath(row: rowToScroll, section: sectionToScroll), at: .top, animated: true) 
}
like image 121
pkamb Avatar answered Sep 22 '22 06:09

pkamb