Обновить UIPageViewController - переупорядочить страницы и добавить новые страницы
У меня есть UIPageViewController
, который я предоставляю данные страницы для использования реализации UIPageControllerDelegate
и UIPageControllerDataSource
.
Все работает отлично, но я хочу иметь возможность добавлять элементы к данным страницы и изменять порядок данных страницы.
Если пользователь уже попал на последнюю страницу, а затем добавляю элемент, они не могут попасть на следующую страницу, потому что viewControllerAfterViewController:
уже вызван. Если они прокручивают назад, а затем переходят на два, они могут получить доступ к новой странице, чтобы данные были правильно настроены. Как я могу сообщить UIPageViewController
, чтобы обновить его хранилище следующего?
Аналогично, я хотел бы изменить порядок коллекции, которая поддерживает просмотр страницы. Но если я это сделаю, у меня будет такая же проблема - просмотр страницы будет считать, что следующая страница по-прежнему является тем, что было в последний раз, когда загружалась текущая страница.
Наверное, я ищу что-то похожее на reloadData:
на UITableView
.
Ответы
Ответ 1
Вам нужно позвонить setViewControllers:direction:animated:completion:
.
Кроме того, в iOS 6 обратите внимание, если вы используете стиль UIPageViewControllerTransitionStyleScroll, так как существует основная ошибка кеширования, если animated:
- ДА (см. мою дискуссию здесь: UIPageViewController navigates на неправильную страницу со стилем перехода по экрану).
Ответ 2
Я нашел обходное решение, чтобы заставить UIPageViewController
забыть о кэшированных контроллерах представлений соседних страниц, которые в настоящее время не отображаются:
pageViewController.dataSource = nil;
pageViewController.dataSource = self;
Я делаю это каждый раз, когда меняю набор страниц. Конечно, это не влияет на отображаемую на данный момент страницу.
В этом обходном пути я избегаю ошибки кэширования и все еще могу использовать animated:YES
в setViewControllers:direction:animated:completion:
.
Ответ 3
Здесь моя полная реализация ответа @ortwin-gentz в методе делегата didFinish в Swift 2, который отлично работает для меня:
func pageViewController(
pageViewController: UIPageViewController,
didFinishAnimating finished: Bool,
previousViewControllers: [UIViewController],
transitionCompleted completed: Bool
) {
if !completed { return }
dispatch_async(dispatch_get_main_queue()) {
pageViewController.dataSource = nil
pageViewController.dataSource = self
}
}