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

Обновить UIPageViewController - переупорядочить страницы и добавить новые страницы

У меня есть UIPageViewController, который я предоставляю данные страницы для использования реализации UIPageControllerDelegate и UIPageControllerDataSource.

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

Если пользователь уже попал на последнюю страницу, а затем добавляю элемент, они не могут попасть на следующую страницу, потому что viewControllerAfterViewController: уже вызван. Если они прокручивают назад, а затем переходят на два, они могут получить доступ к новой странице, чтобы данные были правильно настроены. Как я могу сообщить UIPageViewController, чтобы обновить его хранилище следующего?

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

Наверное, я ищу что-то похожее на reloadData: на UITableView.

4b9b3361

Ответ 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
    }
}