UIPageViewController с несколькими видами

63
7

Мне нужен динамический UIPageViewController, количество страниц зависит от количества элементов моего массива.

У меня есть два мнения. Один для первой страницы, другой - для других страниц. Это будет всегда более 2 страниц (два элемента в моем массиве).

Я пытаюсь проверить с фиксированными значениями. Но пейджинг это не так. Индекс неверен.

1-я проблема, представлениеCountForPageViewController [_vc count] возвращает nil;

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

Пожалуйста помоги!

    - (void)viewDidLoad {
[super viewDidLoad];

FirstViewController *agenda = (FirstViewController*)[self viewControllerAtIndex:0];
[_vc addObject:@"FirstViewController"];
[_vc addObject:@"SecondViewController"];

self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"];
self.pageViewController.dataSource = self;

NSArray *viewControllers = [NSArray arrayWithObject:agenda];

[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

[self addChildViewController:_pageViewController];
[self.view addSubview:_pageViewController.view];
[self.pageViewController didMoveToParentViewController:self];

UIPageControl *pageControlAppearance = [UIPageControl appearanceWhenContainedIn:[UIPageViewController class], nil];
pageControlAppearance.pageIndicatorTintColor = [UIColor lightGrayColor];
pageControlAppearance.currentPageIndicatorTintColor = [UIColor darkGrayColor];

}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{

NSUInteger index = [_vc indexOfObject:viewController];

if ((index == 0) || (index == NSNotFound)) {
return nil;
}

index--;

//notice here I call my instantiation method again essentially duplicating work I have already done!
return [self viewControllerAtIndex:index];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
NSUInteger index = [_vc indexOfObject:viewController];

if (index == NSNotFound) {
return nil;
}

index++;
return [self viewControllerAtIndex:index];
}

#pragma mark - Page View Controller Data Source

- (UIViewController *)viewControllerAtIndex:(NSUInteger)index
{

if (index == 0){
FirstViewController *firstController = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstViewController"];

return firstController;
}
else{
SecondViewController *secondController = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
return secondController;
}

}

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
{
return [_vc count];
}

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
{
return 0;
}

спросил(а) 2021-01-25T15:13:53+03:00 4 месяца, 2 недели назад
1
Решение
63

Согласно комментариям/чату, необходимо решить несколько вещей:

Вам нужно создать экземпляр массива _vc Вам нужно добавить объекты UIViewController в этот массив, а не строки, которые вы используете в настоящее время Вам нужно изменить методы viewControllerBeforeViewController и viewControllerAfterViewController чтобы вернуть соответствующий элемент из массива _vc, не забывая проверить, что индекс остается в пределах массива, чтобы предотвратить прокрутку за финальную страницу или до первой (повестка дня) страницы.

ответил(а) 2021-01-25T15:13:53+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема