Ответ 1
Перезагрузите данные TableView перед вызовом scrollToRowAtIndexPath.
[contentTableView reloadData];
Я пытаюсь, чтобы мой вид таблицы помнил последнюю позицию, так что после того, как приложение будет запущено снова, оно будет прокручиваться до этой позиции. для этого в моем методе 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"];
}
Перезагрузите данные TableView перед вызовом scrollToRowAtIndexPath.
[contentTableView reloadData];
Возможно, контент ContentTableView еще не завершил загрузку данных.
Я хочу подробно рассказать о решении DyingCactus. Я довольно новый разработчик iOS, и моя ситуация была немного иной, но, как он сказал,
"Возможно, контент ContentTableView еще не закончил загрузку данные"
В то время как ответ был кратким, он заставил меня поворачивать колеса, и это было именно то, что происходило для меня.
Моя настройка
[tableView reloadData]
называется[tableView selectRowAtIndexPath:idxPath animated:false scrollPosition:UITableViewScrollPositionTop];
называетсяРешение
Первой проблемой, которую я должен был исправить, было вызов reloadData
в основном потоке, например:
[tblView выполняетSelectorOnMainThread: @selector (reloadData) withObject: nil waitUntilDone: false];
Последняя проблема заключалась в изменении waitUntilDone
на true (DUH!)
Да, так очевидно, для меня контент ContentTableView не был загружен, потому что мой вызов reloadData, который запускается в основном потоке, явно не блокировался до тех пор, пока селектор не будет выполнен.
Надеюсь, это поможет кому-то.