Ошибка с scrollToRowAtIndexPath

Я получаю сообщение об ошибке при использовании моего приложения, в котором используются таблицы, ошибка выглядит следующим образом.

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:]
 строка (3) за пределами (3) для секции (0).

Происходит следующее: когда пользователь просматривает мое навигационное представление, он может выбрать ячейку из табличного представления каждого представления, которая позже будет использоваться для построения строки поиска.

Однако я разрешаю им вернуться и изменить свой выбор, если они допустили ошибку. Эта ошибка возникает, когда пользователь изменяет значение родительского представления, а затем входит в подпредставление, только если предыдущий выбор был за пределами числа записей в текущем столик..

обычно это не было бы большой проблемой, однако внутри viewDidAppear я вызываю метод, который прокручивает до ранее выбранной ячейки... что, очевидно, является тем, что нарушает работу приложения и выдает мне ошибку.

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

как я могу остановить выполнение этого? Я попробовал около 100 различных тестов, если в родительском представлении и подпредставлении перехвачен новый путь индекса и проверены старые выбранные пути индекса, а затем задан параметр

oldCheckedIndexPath = nil;

однако, так или иначе, ему всегда удается все испортить.

Ответ 1

Чистым способом, считая self, является источник данных tableView:

Проверьте количество разделов в представлении таблицы:

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

и проверьте количество строк в этом разделе:

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

Или быстрый хак:

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

Ответ 2

Вдохновленный принятым ответом:

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];
}

Ответ 3

Я решил эту проблему с помощью другой опции перед вызовом scrollToRowAtIndexPath: этот метод перезагружает ваш просмотр таблицы с помощью [yourtableviewobject reloadData]; и затем вызывает:

NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:([messages count] - 1) inSection:0];
[objTableView scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

Ответ 4

Я получил эту ошибку, потому что я пытался прокрутить до строки 0 раздела 0 пустого tableView. Убедитесь, что ваш tableData.count> 0.