Что я должен вернуть в представленииIndexForPageViewController: для моего UIPageViewControllerDataSource?

Документация для возвращаемого значения presentationIndexForPageViewController: говорит:

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

Однако это расплывчато. Будет ли он вызывать этот метод и ожидать соответствующего индекса, когда пользователь прокручивается через контроллер просмотра страницы?

Кроме того, нет никаких гарантий относительно того, когда pageViewController:viewControllerBeforeViewController: и pageViewController:viewControllerAfterViewController:. В документации упоминается только:

Объект

[An] [предоставляет] контроллеры представлений контроллеру просмотра страницы по мере необходимости в ответ на жесты навигации.

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

Значит ли это, что мне нужен последовательный способ узнать, какая страница отображается в настоящее время, зарегистрировавшись как UIPageViewControllerDelegate, а затем постоянно обновляя это значение?

Ответ 1

Что касается presentationCountForPageViewController: и presentationIndexForPageViewController:, в документации указано:

Оба эти метода вызывается после вызова метода setViewControllers:direction:animated:completion:. После навигации с помощью жестов эти методы не вызываются. Индекс обновляется автоматически, и ожидается, что количество контроллеров просмотра останется неизменным.

Следовательно, похоже, что нам нужно вернуть действительное значение сразу после вызова setViewControllers:direction:animated:completion:.

Всякий раз, когда я реализую источник данных, я создаю вспомогательный метод showViewControllerAtIndex:animated: и отслеживаю возвращаемое значение в свойстве presentationPageIndex:

@property (nonatomic, assign) NSInteger presentationPageIndex;
@property (nonatomic, strong) NSArray *viewControllers; // customize this as needed

// ...

- (void)showViewControllerAtIndex:(NSUInteger)index animated:(BOOL)animated {
    self.presentationPageIndex = index;
    [self.pageViewController setViewControllers:@[self.viewControllers[index]] direction:UIPageViewControllerNavigationDirectionForward animated:animated completion:nil];
}

#pragma mark - UIPageViewControllerDataSource

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController {
    return self.presentationPageIndex;
}

Затем вы можете использовать этот метод для отображения правильного контроллера представления и отображения выбранного индекса на правильном значении:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self showViewControllerAtIndex:0 animated:NO];
}

- (IBAction)buttonTapped {
    [self showViewControllerAtIndex:3 animated:YES];
}