it-swarm.com.ru

Обновить UIPageViewController - изменить порядок страниц и добавить новые страницы

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

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

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

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

Я думаю, что я ищу что-то похожее на reloadData: на UITableView.

33
ssloan

Вам нужно позвонить setViewControllers:direction:animated:completion:.

Кроме того, в iOS 6, следите за тем, используете ли вы стиль UIPageViewControllerTransitionStyleScroll, поскольку существует большая ошибка кэширования, если animated: равен YES (см. Мое обсуждение здесь: UIPageViewController переходит на неправильную страницу со стилем перехода Scroll ).

27
matt

Я нашел обходной путь, заставляющий UIPageViewController забыть о контролерах кэшированных представлений соседних страниц, которые в данный момент не отображаются:

pageViewController.dataSource = nil;
pageViewController.dataSource = self;

Я делаю это каждый раз, когда меняю набор страниц. Конечно, это не влияет на текущую страницу.

С помощью этого обходного пути я избегаю ошибки кэширования и все еще могу использовать animated:YES в setViewControllers:direction:animated:completion:.

85
Ortwin Gentz

Вот моя полная реализация ответа @ 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
    }
}
3
theory

Версия Swift 4 для перезагрузки данных pageviewcontroller в версию @ version.

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
    if !completed { return }
    DispatchQueue.main.async() {
        self.dataSource = nil
        self.dataSource = self
    }
}
0
Parion