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

Сохранение позиции прокрутки в UITableView

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

Как я могу получить позицию прокрутки UITableView, чтобы сохранить ее?

Установка позиции прокрутки в UITableView

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

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

В этой таблице у меня есть функция reloadData, поэтому можно удалить последние данные с сервера, а также рабочую панель поиска.

Во всяком случае, рука для помощи была бы замечательной. Спасибо,

Лука

4b9b3361

Ответ 1

Сортировано!

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

[self.tableView setContentOffset:CGPointMake(0,-20) animated:NO];

В наивности я положил это в viewDidAppear, а не viewDidLoad. Очевидно, что это скрывало панель поиска, но при этом она была в неправильной команде void, она делала это каждый раз, когда masterDetailView возвращался в начало стека. Итак, после перемещения вышеуказанного кода в viewDidLoad он теперь все еще скрывает его, но только один раз.

Я просто излагаю это как для других начинающих, таких как я, которые могут столкнуться с одной и той же проблемой и могут просто сохранить их разумность!

Спасибо всем вам за ваши идеи, которые помогли мне.

+1 всем вам!

Ответ 2

Здесь вы должны сначала сохранить прокрученную позицию tableView i.e. contentOffset of tableView, а затем повторно использовать ее, когда вернетесь к tableView.

1) Когда и где вы его сохраните:

Когда: в точке, когда вы сверляете до detailViewController, сохраните contentOffset в tableView

Как: float verticalContentOffset = tableView.contentOffset.y;

2) Как вы вернете tableView обратно в ту же прокрученную позицию:

[tableView setContentOffset:CGPointMake(0, verticalContentOffset)];

Надеюсь, это поможет вам.

Ответ 3

Если кто-то задается вопросом, я попробовал решение от Prashant N, и это сработало. Однако reloadData на самом деле reset положение прокрутки больше нет, поэтому мне не нужно было ничего, кроме reloadData.

Ответ 4

Мое решение этой проблемы состояло в прокрутке таблицы к индексу последнего элемента.

private func scrollToItem(item:Int, section:Int bottom:Bool = true, animated:Bool = false) {
    let indexPath = NSIndexPath(forRow: item:Int-1, inSection: section)
    var position = UITableViewScrollPosition.Bottom
    if (!bottom) { position = UITableViewScrollPosition.Top }
    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: position, animated: animated)
}

Ответ 5

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

NSIndexPath *firstVisibleIndexPath = [[self.tableView indexPathsForVisibleRows] objectAtIndex:0];
[self.tableView scrollToRowAtIndexPath:self.firstVisibleIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
self.firstVisibleIndexPath = firstVisibleIndexPath;

который работал лучше.

Ответ 6

Мое решение для коллекции:

CGFloat oldCollectionViewHeight = self.messageCollectionView.contentSize.height;

[self.messageCollectionView reloadData];
[self.messageCollectionView layoutIfNeeded];

CGFloat newCollectionViewHeight = self.messageCollectionView.contentSize.height;

if (oldCollectionViewHeight) {
    self.messageCollectionView.contentOffset = CGPointMake(0, newCollectionViewHeight - oldCollectionViewHeight);
}

Для таблицы принцип тот же.

Ответ 7

Как упоминалось в других комментариях, прокрутка вверху на Назад навигации в UINavigationController не является поведением по умолчанию.

Другая причина может заключаться в том, что вы устанавливаете ячейку в верхней части таблицы в качестве первого ответчика в viewWillAppear, например. поле поиска или поле редактирования в верхней части таблицы. UITableViewController будет автоматически прокручивать первый ответчик в представлении, что приятно. Пока это то, что вы пытаетесь сделать.:) Позаботьтесь, чтобы не установить первого ответчика в viewWillAppear, если это не то, что вы хотите. Cheers, AZ

Ответ 8

Вам не нужно ничего делать, пока вы находитесь в одном контроллере вида, ваше положение будет таким же. Я боюсь, что где-то в вашем представлении контроллер называется reloadData. Найдите какой-нибудь метод, вызывающий scrollToRowAtIndexPath.

Ответ 9

В моем случае эти 3 строки помогли. Вам нужно указать высоту строки и добавить пустое пространство внизу.

    tableView.rowHeight = UITableView.automaticDimension
    tableView.estimatedRowHeight = 600
    tableView.contentInset.bottom = 40