Подтвердить что ты не робот

UITableView scrollToRowAtIndexPath

Я пытаюсь, чтобы мой вид таблицы помнил последнюю позицию, так что после того, как приложение будет запущено снова, оно будет прокручиваться до этой позиции. для этого в моем методе viewWillDisappear: я получаю первый видимый номер строки и сохраняю его до NSUserDefaults. то в моем представленииDidAppear я пытаюсь прокрутить эту строку, отправив scrollToRowAtIndexPath в представление таблицы. Однако я получаю NSRangeException:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '-[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]: section (0) beyond bounds (0).

любая помощь оценивается. Вот код:

- (void)viewDidAppear:(BOOL)animated
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    if ([userDefaults valueForKey:@"content_row"] != nil)
    {
        int rowToHighlight = [[userDefaults valueForKey:@"content_row"] intValue];
        NSIndexPath * ndxPath= [NSIndexPath indexPathForRow:rowToHighlight inSection:0];
        [contentTableView scrollToRowAtIndexPath:ndxPath atScrollPosition:UITableViewScrollPositionTop  animated:YES];
    }
}

-(void) viewWillDisappear:(BOOL)animated
{
    NSIndexPath *selectedRowPath = [[contentTableView indexPathsForVisibleRows] objectAtIndex:0];
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setInteger:selectedRowPath.row forKey:@"content_row"];
}
4b9b3361

Ответ 1

Перезагрузите данные TableView перед вызовом scrollToRowAtIndexPath.

[contentTableView reloadData];

Ответ 2

Возможно, контент ContentTableView еще не завершил загрузку данных.

Ответ 3

Я хочу подробно рассказать о решении DyingCactus. Я довольно новый разработчик iOS, и моя ситуация была немного иной, но, как он сказал,

"Возможно, контент ContentTableView еще не закончил загрузку данные"

В то время как ответ был кратким, он заставил меня поворачивать колеса, и это было именно то, что происходило для меня.

Моя настройка

  • UITableView находится на ViewController "A"
  • Мое приложение представляет новый ViewController "B"
  • В ViewController "B" нажата кнопка, затем данные будут добавлены в источник данных для UITableView.
  • От обработчика кликов кнопки B, [tableView reloadData] называется
  • От обработчика нажатия кнопки B, [tableView selectRowAtIndexPath:idxPath animated:false scrollPosition:UITableViewScrollPositionTop]; называется
  • ViewController "B" отклоняется и снова отображается "A" (показывая обновленный UITableView).

Решение

  • Первой проблемой, которую я должен был исправить, было вызов reloadData в основном потоке, например:

    [tblView выполняетSelectorOnMainThread: @selector (reloadData) withObject: nil waitUntilDone: false];

  • Последняя проблема заключалась в изменении waitUntilDone на true (DUH!)

Да, так очевидно, для меня контент ContentTableView не был загружен, потому что мой вызов reloadData, который запускается в основном потоке, явно не блокировался до тех пор, пока селектор не будет выполнен.

Надеюсь, это поможет кому-то.