Проблема в том, что вы принимаете pageNumber
как должное. UIPageViewController
может только запросить следующую viewController
для предварительной загрузки, и вы уже увеличиваете pageNumber
.
Вы были близки, когда заметили, что «это также происходит, если пользователь захватывает край страницы и начинает его перемещать, но затем помещает и возвращает обратно на текущую страницу».
Этот метод получает UIViewController
для параметра, и это единственная реальная ссылка , которая у вас есть.
Поскольку у вас есть только три страницы, один из способов решения этой проблемы:
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
if ([viewController isKindOfClass: [One class]])
{
Two *two = [[Two alloc] init];
return two;
}
else if ([viewController isKindOfClass: [Two class]])
{
Three *three = [[Three alloc] init];
return three;
}
else
{
return nil;
}
}
Примечание: этот код не лучшее решение - я просто пытаюсь указать, что вы не должны просто увеличивать / уменьшать pageNumber
в viewControllerAfterViewController:
/ viewControllerBeforeViewController:
Вы могли бы также [[... alloc ]init]
viewControllers до всего этого и уменьшить активность инициализации viewControllers в UIPageViewControllerDataSource
методах до loadView
(если он не загружен) максимум. Например (сокращенно):
...
if ([viewController isKindOfClass: [One class]])
{
//Two *two = [[Two alloc] init]; //called before and two is someone's property
if (![two isViewLoaded]) [two loadView];
return two;
}
else if ...
Для большего количества страниц вы также можете попробовать пометить viewControllers (во время их инициализации). Поскольку UIViewController
сам по себе не имеет свойства тега, вы, вероятно, можете использовать viewController.view.tag
или sublcass UIViewController
и добавить его к свойству pageNumber
(это, вероятно, будет близко к THE решению.