UIPageViewController условно переходит на следующую страницу

#ios #objective-c #uipageviewcontroller

#iOS #objective-c #uipageviewcontroller

Вопрос:

У меня есть UIPageViewController и я могу перейти на следующую и предыдущую страницы, используя приведенные ниже методы делегирования.

 - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    if ([viewController isKindOfClass:[PageController class]])
       return nil;

    if(_counter < 1) {
       return nil;
    }

    self.view.backgroundColor = [UIColor lightGrayColor];
    return [self.storyboard instantiateViewControllerWithIdentifier:@"memoTable"];
}
  

Редактировать:

 - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    //NSLog(@"Child controller count  = %lu",(unsigned long)pageViewController.childViewControllers.count);

    if ([viewController isKindOfClass:[PageController class]])
        return nil;

    if([viewController isKindOfClass:[TableViewController class]])
    {
        TableViewController *viewController1 = (TableViewController*) viewController;
        if (viewController1.dataArr.count < 5) {
            return nil;
        }
    }

    return [self.storyboard instantiateViewControllerWithIdentifier:@"pageView"];
}
  

Теперь я хочу перейти на следующую страницу, если выполнено какое-то условие. Как и на прошлой странице ViewController.isCheck == true.

Как я могу этого добиться?

Комментарии:

1. хм, я немного не уверен в вашем вопросе. Что вы подразумеваете под ViewController последней страницы? Как получить последнюю страницу ViewController?

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

3. @SaurabhJain Я регистрируюсь viewControllerAfterViewController . Все работает нормально. Но столкнулся с одной проблемой, что если viewControllerAfterViewController вернуть nil, то в следующий раз я не смогу прокрутить страницу.

4. @SaurabhJain понял мою проблему?

5. @EktaPadaliya возвращает ноль, т.е. ваш контроллер просмотра является последним контроллером просмотра.

Ответ №1:

Вы можете просто добавить это условие к одному из существующих ifs и вернуть nil, если условие не проверено. Что-то вроде:

 - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    if ([viewController isKindOfClass:[PageController class]] || ((YourViewControllerClass *)viewController).isCheck == false)
       return nil;

    return [self.storyboard instantiateViewControllerWithIdentifier:@"pageView"];
}
  

Комментарии:

1. Я сделал то же самое, что и вы, но если он вернет nil, то в следующий раз он не позволит прокручивать, даже если условие выполнено.

2. Вы выполнили приведение к вашему подклассу ViewController?

3. Моя проблема в том, что когда вышеуказанный метод возвращает nil после этого, я не могу провести пальцем. т. е. после nil вышеуказанный метод никогда не вызывается.

Ответ №2:

Просто проверьте созданный вами экземпляр контроллера просмотра, прежде чем возвращать его в pageViewController:viewControllerAfterViewController методе.

 - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    if ([viewController isKindOfClass:[PageController class]])
       return nil;

    let pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"pageView"];
    if (pageViewController.isCheck)
       return pageViewController;
    else return nil;
}
  

Комментарии:

1. Я сделал то же самое, что и вы, но если он вернет nil, то в следующий раз он не позволит прокручивать, даже если условие выполнено.

2. Вы выполнили приведение к вашему подклассу ViewController?

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

4. @ramacode Я хочу добавить только один ViewController и повторять его, когда пользователь проводит пальцем. Например, когда пользователь проводит пальцем, у меня один ViewController не отличается.

Ответ №3:

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

 UIViewController* memoViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"memoTable"];
UIViewController* pageViewContentController = [self.storyboard instantiateViewControllerWithIdentifier:@"pageView"];
  

назначьте все контроллеры представления, которые вам понадобятся, в виде массива

 NSArray* reservedViewControllers = @[memoViewController, pageViewController];
  

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

 int currentIndex = 0;
  

Затем вы можете легко выполнять итерации между вашими контроллерами просмотра в функциях UIPageViewControllerDataSource.

 - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
    {
        if(currentIndex == 0) return nil;
        currentIndex = currentIndex - 1;
        return reservedViewControllers[currentIndex];
    }

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    if(currentIndex == reservedViewControllers.count) return nil;
    currentIndex = currentIndex   1;

    //check for last page
    if(currentIndex == reservedViewControllers.count){
          UIViewController* lastViewController = reservedViewControllers[currentIndex];
          if(lastViewController.isCheck == false) return nil;
    }

    return reservedViewControllers[currentIndex];
}
  

Комментарии:

1. Я хочу добавить только один ViewController и повторить его, когда пользователь проведет пальцем. Например, когда пользователь проводит пальцем, у меня один ViewController не отличается.

2. @ramcode Я хочу добавлять «memoTable» всякий раз, когда пользователь проводит пальцем. Мне нужно добавлять «memoTable» всякий раз, когда пользователь проводит пальцем по экрану next и выполняется условие.

Ответ №4:

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

смотрите ссылку: https://github.com/cwRichardKim/RKSwipeBetweenViewControllers
https://github.com/nicklockwood/SwipeView