У меня есть всплывающее окно, подключенное к кнопке в моем приложении для iPad. Всплывающее окно отображает NavigationController со встроенным TableViewController (все настройки с использованием раскадровок). Контроллер табличного представления отображает список закладок с идеей, что пользователь может выбрать одну, всплывающее окно исчезнет, и закладка будет применена. Все это прекрасно работает, однако, когда пользователь открывает поповер, табличное представление всегда прокручивается до самого верха (я предполагаю, что это потому, что контроллер представления создается каждый раз с нуля; есть ли способ изменить это?) , Я хотел бы, чтобы список оставался прокручиваемым до той же позиции, в которой он находился, когда закрывается поповер.
Я прочитал много постов о том, как решить эту проблему, что все в основном состоит из сохранения смещения содержимого (или первого / последнего видимого элемента) в viewWillDisappear, а затем прокрутки табличного представления в viewWillAppear. Когда я это делаю, табличное представление прокручивается, но не в правильную позицию. До сих пор я не смог определить рифму или причину, по которой объем прокручивается в итоге.
Я пытался сначала заставить вид на макет, чтобы правильно установить высоту, прежде чем прокрутка, но это, кажется, не имеет никакого эффекта.
Если я поместил код прокрутки в viewDidAppear, то он прокручивается в правильное место, но пользователь может видеть скачок представления. Для меня это говорит о том, что смещение сохраненного содержимого является правильным, и проблема заключается в попытке установить смещение содержимого до завершения загрузки представления.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
//This appears to have no effect.
tableView.setNeedsLayout()
tableView.layoutIfNeeded()
tableView.setContentOffset(BookmarksTableViewController.scrollPos, animated: false)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
//Uncommenting this will cause the view to scroll to the correct position, but after the table view is visible.
//tableView.setContentOffset(BookmarksTableViewController.scrollPos, animated: false)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
BookmarksTableViewController.scrollPos = tableView.contentOffset
}