Вопрос по ios, uipageviewcontroller, objective-c, cocoa-touch – UIPageViewController - как я могу перейти к определенному номеру страницы?

13

Я потратил почти 8 часов, чтобы узнать, как перейти к определенному номеру страницы в UIPageViewController ... ниже мой проект выглядит так

Я хочу сделать приложение, которое выглядит как Ibooks ---

Я воспользовался помощью кода, представленного здесь -http://www.ioslearner.com/tag/uipageviewcontroller-sample-code/

Я сделал plist и UITableView, я выбираю значение из TableView и отображаю его в webView, размещенном на UIPAgeiewController, но проблема в том, что меняется только страница в веб-представлении, а не фактический номер страницы UIPageViewController ....

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

Виноват ------ A K
как я сказал ниже, ваш другой вопрос: я никогда не работал с ним, но это выглядит многообещающе:stackoverflow.com/questions/7208871/… vikingosegundo
случайно у вас есть идея, как решить вышеуказанную проблему? @vikingosegundo A K
почему это помечено [apex-code]? vikingosegundo
увидеть? как только пометка станет лучше, вы получите больше внимания, и один из самых успешных ответчиков [target-c] и [ios] ответит на ваш вопрос. vikingosegundo

Ваш Ответ

5   ответов
2

@milijan ответ работал отлично. Вот быстрая версия его ответа:

func jumptoPage(index : Int) {

    let vc = viewControllerAtIndex(index)
    let direction : UIPageViewControllerNavigationDirection!

    if currentIndex < index {
        direction = UIPageViewControllerNavigationDirection.Forward
    }
    else {
        direction = UIPageViewControllerNavigationDirection.Reverse
    }

    if (currentIndex < index) {
        for var i = 0; i <= index; i++ {
            if (i == index) {
                self.newPageViewController.setViewControllers([vc], direction: direction, animated: true, completion: nil)
            }
            else {
                self.newPageViewController.setViewControllers([viewControllerAtIndex(i)], direction: direction, animated: false, completion: nil)
            }
        }
    }
    else {
        for var i = currentIndex; i >= index; i = i - 1 {
            if i == index {
                self.newPageViewController.setViewControllers([vc], direction: direction, animated: true, completion: nil)
            }
            else {
                self.newPageViewController.setViewControllers([viewControllerAtIndex(i)], direction: direction, animated: false, completion: nil)
            }
        }
    }
 currentIndex = index
}
Что делать, если все viewControllers еще не загружены. Иногда мы лениво загружаем просмотры специально, когда количество страниц велико.
5

Вы должны создать экземпляр контроллера (ов) представления, которые управляют страницами, на которые вы хотите перейти, и затем вызвать контроллер представления страницы.setViewControllers:direction:animated:completion: метод, передавая новые контроллеры представления.

Посмотрите на вопрос, связанный с vikingosegundo в его комментарии. Один ответ на него даже содержит пример кода.
Я понимаю, о чем вы говорите ... но не полностью ... не могли бы вы рассказать мне об этом подробнее ... Я новичок в Xcode и потратил почти 15 часов на эту проблему .. Спасибо за авансировать A K
3

Вот еще один пример, как перейти на страницу с проанализированным индексом:

-(void)gotoPage:(int)index{


    SinglePageViewController *viewController = [self viewControllerAtIndex:index];

    UIPageViewControllerNavigationDirection direction;
    if(_curIndex <= index){
        direction = UIPageViewControllerNavigationDirectionForward;
    }
    else
    {
        direction = UIPageViewControllerNavigationDirectionReverse;
    }


    if(_curIndex < index)
    {
        for (int i = 0; i <= index; i++)
        {
            if (i == index) {
                [self.pageViewController setViewControllers:@[viewController]
                                          direction:direction
                                           animated:YES
                                         completion:nil];
            }
            else
            {
                [self.pageViewController setViewControllers:@[[self viewControllerAtIndex:i]]
                                          direction:direction
                                           animated:NO
                                         completion:nil];

            }
        }
    }
    else
    {
        for (int i = _curIndex; i >= index; i--)
        {
            if (i == index) {
                [self.pageViewController setViewControllers:@[viewController]
                                          direction:direction
                                           animated:YES
                                         completion:nil];
            }
            else
            {
                [self.pageViewController setViewControllers:@[[self viewControllerAtIndex:i]]
                                          direction:direction
                                           animated:NO
                                         completion:nil];

            }
        }
    }

    _curIndex = index;
}
Кстати, _curIndex - это свойство NSUInteger, объявите его в interface ()
2

Я использую эту функцию (я всегда в альбомной ориентации, двухстраничный режим)

-(void) flipToPage:(NSString * )index {


int x = [index intValue];
LeafletPageContentViewController *theCurrentViewController = [self.pageViewController.viewControllers   objectAtIndex:0];

NSUInteger retreivedIndex = [self indexOfViewController:theCurrentViewController];

LeafletPageContentViewController *firstViewController = [self viewControllerAtIndex:x];
LeafletPageContentViewController *secondViewController = [self viewControllerAtIndex:x+1 ];


NSArray *viewControllers = nil;

viewControllers = [NSArray arrayWithObjects:firstViewController, secondViewController, nil];


if (retreivedIndex < x){

    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL];

} else {

    if (retreivedIndex > x ){

        [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:NULL];
      } 
    }
} 

Может тебе это тоже нужно

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

    if (([self.modelArray count] == 0) || (index >= [self.modelArray count])) {
        return nil;
    }
    LeafletPageContentViewController *dataViewController;
    dataViewController = [[LeafletPageContentViewController alloc]initWithNibName:@"LeafletPageContentViewController" bundle:nil];

    dataViewController.dataObject = [self.modelArray objectAtIndex:index];
    return dataViewController;

}
Это работает для вас.
да, в моем коде эта строка & quot; [self.pageViewController.viewControllers objectAtIndex: 0]; не работает.
Да, я использую этот метод в приложении. У тебя какие-то проблемы?
замените self.pageViewController на имя вашего pageViewController и попробуйте вместо _pageViewController вместо self.pageViewController
это не проблема, viewControllers равны нулю, но при вызове делегатами это работает, но при вызове кнопкой показывает нулевое значение.
3

Свифт Код:

func goToPage(index: Int) {
    if index < viewControllers.count {
        pageVC!.setViewControllers([viewControllers[index]], direction: .Forward, animated: true, completion: nil)
    }
}

Похожие вопросы