source

UIPageViewController에서 프로그래밍 방식으로 페이지를 넘길 수 있습니까?

factcode 2023. 6. 13. 22:50
반응형

UIPageViewController에서 프로그래밍 방식으로 페이지를 넘길 수 있습니까?

에서 프로그래밍 방식으로 페이지를 넘길 수 있습니까?UIPageViewController?

예, 다음과 같은 방법으로 가능합니다.

- (void)setViewControllers:(NSArray *)viewControllers 
                 direction:(UIPageViewControllerNavigationDirection)direction 
                  animated:(BOOL)animated 
                completion:(void (^)(BOOL finished))completion;`

이 방법은 페이지의 첫 번째 보기 컨트롤러를 설정하는 데 사용되는 방법과 동일합니다.마찬가지로 다른 페이지로 이동하는 데 사용할 수 있습니다.

왜 그럴까요?viewControllers단일 뷰 컨트롤러가 아닌 어레이입니까?

이는 페이지 뷰 컨트롤러에 한 번에 2페이지의 콘텐츠를 표시하는 "척추"(iBooks에서처럼)가 있을 수 있기 때문입니다.한 번에 한 페이지의 내용을 표시하는 경우 1-요소 배열을 전달합니다.

Swift의 예:

pageContainer.setViewControllers([displayThisViewController], direction: .Forward, animated: true, completion: nil)

저도 이것이 필요했기 때문에, 이것을 어떻게 하는지 더 자세히 설명하겠습니다.

참고: 표준 템플릿 양식을 사용하여 다음을 생성했다고 가정합니다.UIPageViewController구조 - 두 가지를 모두 가지고 있습니다.modelViewController그리고.dataViewController호출할 때 생성됩니다.내가 쓴 것을 이해하지 못하면 돌아가서 다음을 사용하는 새 프로젝트를 만듭니다.UIPageViewController수 있을 겁니다.그러면 이해하실 겁니다.

따라서 특정 페이지로 이동하려면 위에 나열된 방법의 다양한 부분을 설정해야 합니다.이 연습에서는 두 의 뷰가 표시된 풍경 뷰라고 가정합니다.또한 버튼을 누르거나 다른 방법으로 수행할 수 있도록 IBA 액션으로 구현했습니다. 선택적으로 전화를 걸어 필요한 항목을 전달하는 것도 간단합니다.

따라서 이 예제의 경우 표시되는 두 개의 보기 컨트롤러가 필요하며, 선택적으로 책에서 앞으로 진행하든 뒤로 진행하든 상관없이 표시됩니다.

참고로 나는 단지 4, 5페이지로 가서 앞으로 전표를 사용해야 하는 곳을 하드 코딩했을 뿐입니다.여기서 항목을 얻는 데 도움이 되는 변수를 전달하기만 하면 됩니다.

-(IBAction) flipToPage:(id)sender {

    // Grab the viewControllers at position 4 & 5 - note, your model is responsible for providing these.  
    // Technically, you could have them pre-made and passed in as an array containing the two items...

    DataViewController *firstViewController = [self.modelController viewControllerAtIndex:4 storyboard:self.storyboard];
    DataViewController *secondViewController = [self.modelController viewControllerAtIndex:5 storyboard:self.storyboard];

    //  Set up the array that holds these guys...

    NSArray *viewControllers = nil;

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

    //  Now, tell the pageViewContoller to accept these guys and do the forward turn of the page.
    //  Again, forward is subjective - you could go backward.  Animation is optional but it's 
    //  a nice effect for your audience.

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

    //  Voila' - c'est fin!  

}

다음은 단일 페이지 보기에 대한 다른 코드 예제입니다.viewController At에 대한 구현여기서는 인덱스가 생략되었습니다. 지정된 인덱스에 대한 올바른 뷰 컨트롤러를 반환해야 합니다.

- (void)changePage:(UIPageViewControllerNavigationDirection)direction {
    NSUInteger pageIndex = ((FooViewController *) [_pageViewController.viewControllers objectAtIndex:0]).pageIndex;

    if (direction == UIPageViewControllerNavigationDirectionForward) {
        pageIndex++;
    }
    else {
        pageIndex--;
    }

    FooViewController *viewController = [self viewControllerAtIndex:pageIndex];

    if (viewController == nil) {
        return;
    }

    [_pageViewController setViewControllers:@[viewController]
                                  direction:direction
                                   animated:YES
                                 completion:nil];
}

호출을 통해 페이지를 변경할 수 있습니다.

[self changePage:UIPageViewControllerNavigationDirectionReverse];
[self changePage:UIPageViewControllerNavigationDirectionForward];

저는 여기서 완전히 뭔가를 놓치고 있을 수도 있지만, 이 해결책은 다른 많은 사람들이 제안한 것보다 훨씬 더 간단해 보입니다.

extension UIPageViewController {
    func goToNextPage(animated: Bool = true, completion: ((Bool) -> Void)? = nil) {
        if let currentViewController = viewControllers?[0] {
            if let nextPage = dataSource?.pageViewController(self, viewControllerAfter: currentViewController) {
                setViewControllers([nextPage], direction: .forward, animated: animated, completion: completion)
            }
        }
    }
}

이 코드는 저에게 잘 작동했습니다, 감사합니다.

이것이 제가 그것으로 한 일입니다.앞으로 이동하거나 뒤로 이동하는 방법과 특정 페이지로 직접 이동하는 방법이 있습니다.세로 보기의 6페이지 문서입니다.페이지뷰컨트롤러 템플릿의 루트컨트롤러 구현에 붙여넣으면 됩니다.

-(IBAction)pageGoto:(id)sender {

    //get page to go to
    NSUInteger pageToGoTo = 4;

    //get current index of current page
    DataViewController *theCurrentViewController = [self.pageViewController.viewControllers   objectAtIndex:0];
    NSUInteger retreivedIndex = [self.modelController indexOfViewController:theCurrentViewController];

    //get the page(s) to go to
    DataViewController *targetPageViewController = [self.modelController viewControllerAtIndex:(pageToGoTo - 1) storyboard:self.storyboard];

    DataViewController *secondPageViewController = [self.modelController viewControllerAtIndex:(pageToGoTo) storyboard:self.storyboard];

    //put it(or them if in landscape view) in an array
    NSArray *theViewControllers = nil;    
    theViewControllers = [NSArray arrayWithObjects:targetPageViewController, secondPageViewController, nil];


    //check which direction to animate page turn then turn page accordingly
    if (retreivedIndex < (pageToGoTo - 1) && retreivedIndex != (pageToGoTo - 1)){
        [self.pageViewController setViewControllers:theViewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL];
    }

    if (retreivedIndex > (pageToGoTo - 1) && retreivedIndex != (pageToGoTo - 1)){
        [self.pageViewController setViewControllers:theViewControllers direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:NULL];
    }

}


-(IBAction)pageFoward:(id)sender {

    //get current index of current page
    DataViewController *theCurrentViewController = [self.pageViewController.viewControllers objectAtIndex:0];
    NSUInteger retreivedIndex = [self.modelController indexOfViewController:theCurrentViewController];

    //check that current page isn't first page
    if (retreivedIndex < 5){

        //get the page to go to
        DataViewController *targetPageViewController = [self.modelController viewControllerAtIndex:(retreivedIndex + 1) storyboard:self.storyboard];

        //put it(or them if in landscape view) in an array
        NSArray *theViewControllers = nil;    
        theViewControllers = [NSArray arrayWithObjects:targetPageViewController, nil];

        //add page view
        [self.pageViewController setViewControllers:theViewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL];

    }

}


-(IBAction)pageBack:(id)sender {


    //get current index of current page
    DataViewController *theCurrentViewController = [self.pageViewController.viewControllers objectAtIndex:0];
    NSUInteger retreivedIndex = [self.modelController indexOfViewController:theCurrentViewController];

    //check that current page isn't first page
    if (retreivedIndex > 0){

    //get the page to go to
    DataViewController *targetPageViewController = [self.modelController viewControllerAtIndex:(retreivedIndex - 1) storyboard:self.storyboard];

    //put it(or them if in landscape view) in an array
    NSArray *theViewControllers = nil;    
    theViewControllers = [NSArray arrayWithObjects:targetPageViewController, nil];

    //add page view
    [self.pageViewController setViewControllers:theViewControllers direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:NULL];

    }

}

스위프트 4:

페이지 컨트롤러 보기 컨트롤러에서 다음을 누르면 다음 컨트롤러로 이동하고 페이지 제어 색인도 업데이트해야 했기 때문에 이것이 가장 쉽고 가장 간단한 해결책이었습니다.

let pageController = self.parent as! PageViewController

pageController.setViewControllers([parentVC.orderedViewControllers[1]], direction: .forward, animated: true, completion: nil)

pageController.pageControl.currentPage = 1

dataSource의 메소드를 사용하는 것은 어떻습니까?

UIViewController *controller = [pageViewController.dataSource pageViewController:self.pageViewController viewControllerAfterViewController:pageViewController.viewControllers.firstObject];
[pageViewController setViewControllers:@[controller] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];

거꾸로 가는 것과 유사합니다.

그러나 이 'self.pageViewController setViewControllers' 메서드 호출을 사용하면 페이지를 수동으로 돌리면 viewDidDispare가 반환된 페이지에 대해 viewController에서 'viewDidDispare'를 호출하지 않습니다.이것이 제 추락의 원인이라고 생각합니다.

"제공된 보기 컨트롤러 수(0)가 요청된 전환에 필요한 수(1)와 일치하지 않습니다."

Swift에서:

import UIKit

extension HomeViewController {

    // MARK: - Carousel management.

    func startTimerForMovingCarousel(let numberOfSecondsBetweenFiringsOfTheTimer: NSTimeInterval) {
        if (self.timerForMovingCarousel == nil) {
            self.timerForMovingCarousel = NSTimer.scheduledTimerWithTimeInterval(numberOfSecondsBetweenFiringsOfTheTimer,
                                                                            target: self,
                                                                            selector: "moveCarousel",
                                                                            userInfo: nil,
                                                                            repeats: true)
        }
    }

    func moveCarousel() {
        println("I move the carousel.")

        let currentContentViewControllerDisplayed = self.pageViewController!.viewControllers[0] as! ContentViewController

        var index: Int = currentContentViewControllerDisplayed.index

        if index == self.arrayViewControllers.count - 1 {
            index = 0
        } else {
            ++index
        }

        let contentViewControllerToDisplay = self.arrayViewControllers[index] as! ContentViewController

        self.pageViewController.setViewControllers([contentViewControllerToDisplay],
                                                    direction: UIPageViewControllerNavigationDirection.Forward,
                                                    animated: true,
                                                    completion: nil)

        self.pageControl.currentPage = contentViewControllerToDisplay.index
    }

    func invalidateTimerForMovingCarousel() {
        if (self.timerForMovingCarousel != nil) {
            self.timerForMovingCarousel.invalidate()
            self.timerForMovingCarousel = nil
        }
    }

}

또한 페이지뷰 컨트롤러에서 왼쪽으로 이동하는 버튼이 필요했는데, 이 버튼은 스와이프 동작에서 예상되는 것과 정확히 일치해야 합니다.

자연 스와이프 탐색을 처리하기 위해 "pageViewController:viewControllerBeforeViewController" 내에 이미 몇 가지 규칙이 있었기 때문에 버튼이 모든 코드를 다시 사용하기를 원했고 이전 답변처럼 페이지에 도달하기 위해 특정 인덱스를 사용할 수 없었습니다.그래서 저는 다른 해결책을 취해야 했습니다.

다음 코드는 내 사용자 정의 보기 컨트롤러 내의 속성이며 척추가 중간으로 설정된 페이지 보기 컨트롤러에 대한 코드입니다.

왼쪽 탐색 버튼에 대해 작성한 코드는 다음과 같습니다.

- (IBAction)btnNavigateLeft_Click:(id)sender {

    // Calling the PageViewController to obtain the current left page
    UIViewController *currentLeftPage = [_pageController.viewControllers objectAtIndex:0];

    // Creating future pages to be displayed
    NSArray *newDisplayedPages = nil;
    UIViewController *newRightPage = nil;
    UIViewController *newLeftPage = nil;

    // Calling the delegate to obtain previous pages
    // My "pageViewController:viewControllerBeforeViewController" method returns nil if there is no such page (first page of the book).
    newRightPage = [self pageViewController:_pageController viewControllerBeforeViewController:currentLeftPage];
    if (newRightPage) {
        newLeftPage = [self pageViewController:_pageController viewControllerBeforeViewController:newRightPage];
    }

    if (newLeftPage) {
        newDisplayedPages = [[NSArray alloc] initWithObjects:newLeftPage, newRightPage, nil];
    }

    // If there are two new pages to display, show them with animation.
    if (newDisplayedPages) {
        [_pageController setViewControllers:newDisplayedPages direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:nil];
    }
}

여기서 오른쪽 탐색 단추를 만드는 것과 매우 유사한 작업을 수행할 수 있습니다.

PAGE CONTROL에서 현재 페이지가 O & &amp; 페이지를 스크롤페이지 뷰 컨트롤러의 사용자 지정 버튼을 클릭하여 탐색하기를 원하는 경우 아래가 도움이 될 수 있습니다.

//Set Delegate & Data Source for PageView controller [Say in View Did Load]
   self.pageViewController.dataSource = self;
   self.pageViewController.delegate = self;

// Delegates called viewControllerBeforeViewController when User Scroll to previous page 

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

    [_nextBtn setTitle:@"Next" forState:UIControlStateNormal];

    NSUInteger index = ((PageContentViewController*) viewController).pageIndex;

    if (index == NSNotFound){
        return nil;
    }else if (index > 0){
        index--;
    }else{
        return nil;
    }        
    return [self viewControllerAtIndex:index];        
}

사용자가 다음 페이지로 스크롤할 때 위임자가 ViewControllerAfterViewController를 호출함

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

    NSUInteger index = ((PageContentViewController*) viewController).pageIndex;

if (index == NSNotFound){
    return nil;
}else if (index < 3){
    index++;
}else{
    return nil;
}
return [self viewControllerAtIndex:index];}

//Delegate called while transition of pages. The need to apply logic in this delegate is to maintain the index of current page.

 - (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers{ 

buttonIndex = (int)((PageContentViewController*) pendingViewControllers.firstObject).pageIndex;

}

-(void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed{    
if (buttonIndex == 0){
    _backButton.hidden = true;
}else if (buttonIndex == [self.pageImages count] - 1){
    _backButton.hidden = false;
    [_nextBtn setTitle:@"Begin" forState:UIControlStateNormal];
}else{
    _backButton.hidden = false;
}

}

//사용자 지정 버튼의 (사전 설정 및 다음) 로직

-(void)backBtnClicked:(id)sender{
    if (buttonIndex > 0){
buttonIndex -= 1;
    }
    if (buttonIndex < 1) {
        _backButton.hidden = YES;
    }
    if (buttonIndex >=0) {
         [_nextBtn setTitle:@"Next" forState:UIControlStateNormal];
        PageContentViewController *startingViewController = [self viewControllerAtIndex:buttonIndex];
        NSArray *viewControllers = @[startingViewController];
        [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
    }

}

-(void)nextBtnClicked:(id)sender{
if (buttonIndex < 3){
buttonIndex += 1;
}
if(buttonIndex == _pageImages.count){
   //Navigate Outside Pageview controller        
}else{        
    if (buttonIndex ==3) {

        [_nextBtn setTitle:@"Begin" forState:UIControlStateNormal];
    }
    _backButton.hidden = NO;

    PageContentViewController *startingViewController = [self viewControllerAtIndex:buttonIndex];
    NSArray *viewControllers = @[startingViewController];
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
}

}

//BUTTON INDEX & MAX COUNT
-(NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController{
    return [self.pageImages count];}

-(NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController{
    return  buttonIndex;}
- (void)moveToPage {

    NSUInteger pageIndex = ((ContentViewController *) [self.pageViewController.viewControllers objectAtIndex:0]).pageIndex;

    pageIndex++;

    ContentViewController *viewController = [self viewControllerAtIndex:pageIndex];

if (viewController == nil) {
        return;
    }
    [self.pageViewController setViewControllers:@[viewController] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];

}

//이제 이 메서드를 호출합니다.

[자체 페이지로 이동];

효과가 있기를 바랍니다 :)

한 페이지에 대해, 저는 @Jack Humphries의 답변을 편집했습니다.

-(void)viewDidLoad
{
  counter = 0;
}
-(IBAction)buttonClick:(id)sender
{
  counter++;
  DataViewController *secondVC = [self.modelController viewControllerAtIndex:counter storyboard:self.storyboard];
  NSArray *viewControllers = nil;          
  viewControllers = [NSArray arrayWithObjects:secondVC, nil];          
  [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL];
}

@samwiz가 지적했듯이, 페이지를 작성하는 방법은 다음과 같습니다.

setViewControllers:array

제가 한 방법은 이렇습니다. 저는 제 데이터 소스와 대리인을 분리했습니다.이 메서드를 호출하고 "다음" 보기만 변경할 수 있습니다.이전에는 페이징 규칙을 적용해야 합니다.즉, 방향과 다음 컨트롤러를 확인해야 합니다.이 방법을 사용자 지정 데이터 소스와 함께 사용하는 경우 표시되는 컨트롤러 배열은 변경되지 않습니다(NSObject 하위 클래스에서 사용자 지정 배열을 사용하므로).

사용자 고유의 데이터 소스를 사용하여 특정 방향으로 새 보기를 설정할 수 있습니다.일반적으로 스위핑할 때 표시되는 페이지를 계속 제어할 수 있기 때문입니다.

어제부터 작업을 하고 있는데 드디어 작업을 하게 되었습니다.표준 템플릿을 완전히 사용할 수 없었습니다. 왜냐하면 다음과 같은 세 가지 다른 뷰 컨트롤러를 하위 뷰로 사용하고 있기 때문입니다.

1 - rootViewController;
2 - model;
3 - viewControllers
3.1 - VC1;
3.2 - VC2;
3.3 - VC3.
Note: all of VCs has Storyboard ID.

처음 하나의 VC에만 트리거 버튼이 필요했기 때문에 pageViewController 및 모델에 대해 하나의 속성을 추가했습니다.

#import <UIKit/UIKit.h>
#import "Model.h"

@interface VC1 : UIViewController

@property (nonatomic, strong) UIPageViewController *thePageViewController;
@property (nonatomic, strong) SeuTimePagesModel *theModel;

@end

모델의 init 메서드를 다시 작성하여 스토리보드와 pageViewController를 매개 변수로 전달하여 VC1로 설정했습니다.

- (id)initWithStoryboard:(UIStoryboard *)storyboard
   andPageViewController:(UIPageViewController *)controller
{
    if (self = [super init])
    {
        VC1 *vc1 = [storyboard instantiateViewControllerWithIdentifier:@"VC1"];
        vc1.pageViewController = controller;
        vc1.model = self;

        VC2 *vc2 = [storyboard instantiateViewControllerWithIdentifier:@"VC2"];
        VC3 *vc3 = [storyboard instantiateViewControllerWithIdentifier:@"VC3"];
        self.pageData = [[NSArray alloc] initWithObjects:vc1, vc2, vc3, nil];
    }

    return self;
}

마지막으로 VC1에 IBAction을 추가하여 pageViewController 메서드 setViewControllers:direction:animated:completion::

- (IBAction)go:(id)sender
{
    VC2 *vc2 = [_model.pages objectAtIndex:1];
    NSArray *viewControllers = @[vc2];
    [_pageViewController setViewControllers:viewControllers
                                  direction:UIPageViewControllerNavigationDirectionForward
                                   animated:YES
                                 completion:nil];
}

참고 VC 인덱스를 찾을 필요가 없습니다. 단추를 누르면 두 번째 VC로 이동하지만 모든 인덱스를 가져오고 하위 보기를 추적하는 것은 어렵지 않습니다.

- (IBAction)selecionaSeuTime:(id)sender
{
    NSUInteger index = [_model.pages indexOfObject:self];
    index++;

    VC2 *vc2 = [_model.pages objectAtIndex:1];
    NSArray *viewControllers = @[vc2];
    [_pageViewController setViewControllers:viewControllers
                                  direction:UIPageViewControllerNavigationDirectionForward
                                   animated:YES
                                 completion:nil];
}

도움이 되길 바랍니다!

다음은 UIPageViewControllerDataSource 메서드를 사용하는 솔루션입니다.

코드는 UIPageViewController에서 현재 표시된 보기 컨트롤러를 추적합니다.

...
@property (nonatomic, strong) UIViewController *currentViewController;
@property (nonatomic, strong) UIViewController *nextViewController;
...

먼저 현재 ViewController를 UIPageViewController에 대해 설정된 초기 ViewController로 초기화합니다.

- (void) viewDidLoad {
    [super viewDidLoad];
    ...
    self.currentViewController = self.viewControllers[0];
    ...
    [self.pageViewController setViewControllers: @[self.currentViewController] direction: dir animated: YES completion: nil];
}


그런 다음 UIPageViewControllerDelegate 메서드: pageViewController: willTransitionToViewController:pageViewController: didFinishAnimating: previousViewController: transitionCompleted:


- (nullable UIViewController *) pageViewController: (UIPageViewController *) pageViewController viewControllerBeforeViewController: (UIViewController *) viewController {
    NSInteger idx = [self.viewControllers indexOfObject: viewController];
    if (idx > 0) {
        return self.viewControllers[idx - 1];
    } else {
        return nil;
    }
}

- (nullable UIViewController *) pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController: (UIViewController *) viewController {
    NSInteger idx = [self.viewControllers indexOfObject: viewController];
    if (idx == NSNotFound) {
        return nil;
    } else {
        if (idx + 1 < self.viewControllers.count) {
            return self.viewControllers[idx + 1];
        } else {
            return nil;
        }
    }
}

- (void) pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray<UIViewController *> *)pendingViewControllers {
    self.nextViewController = [pendingViewControllers firstObject];
}

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray<UIViewController *> *)previousViewControllers transitionCompleted:(BOOL)completed {
    if (completed) {
        self.currentViewController = self.nextViewController;
    }
}

마지막으로, 선택한 방법(아래 예에서는 - (id) sender의 - (IBAction)을 사용하여 다음 컨트롤러 또는 이전 컨트롤러로 프로그래밍 방식으로 전환할 수 있습니다. UIPageViewControllerDataSource 메서드 페이지ViewController:ViewController:ViewController:,pageViewController:viewControllerAfterViewController: [self.pageViewController setViewController:@[vc] direction:UIPageViewControllerNavigationForward animated:YES completion:nil]을 호출하여 다음 또는 미리 보기 컨트롤러로 이동합니다.


- (void) onNext {
    UIViewController *vc = [self pageViewController: self.tutorialViewController viewControllerAfterViewController: self.currentViewController];
    if (vc != nil) {
        self.currentViewController = vc;
        [self.tutorialViewController setViewControllers: @[vc] direction: UIPageViewControllerNavigationDirectionForward animated: YES completion: nil];
    }
}

View 컨트롤러는 PageView 컨트롤러에 내장되어 있으므로 다음 작업만 수행하면 됩니다.

  • 상위 뷰 컨트롤러를 검색하고 관련 클래스로 캐스팅합니다.
  • 해당 상위 데이터 원본 속성을 사용하여 다음 ViewController를 가져옵니다.
  • SetParentViewControllers 메서드를 사용하여 설정하고 다음 페이지로 전환합니다.

예를 들어 사마린의 경우이지만 기능적으로는 스위프트 등과 유사합니다.다음 코드는 버튼 클릭 위임에 있습니다. 페이지로 표시되는 ViewController 중 하나에서 delegate를 클릭합니다.

var parent = ParentViewController as WelcomePageViewController;
var next = parent.DataSource.GetNextViewController(parent, this);

parent.SetViewControllers(new UIViewController[] { next }, UIPageViewControllerNavigationDirection.Forward, true, null);

가장 간단한 2022년 솔루션:

어떤 일이 있어도 다음과 같은 간단한 기능이 필요합니다.

var currentIndex: Int {
    if let visibleViewController = viewControllers?.first,
       let ci = pages.firstIndex(of: visibleViewController) {
        return ci
    }
    else {
        return 0
    }
}

그러면 주어진 페이지로 애니메이션을 쉽게 만들 수 있습니다.

public func go(toIndex: Int) {
    setViewControllers(
        [pages[toIndex]],
        direction: ((currentIndex < toIndex) ? .forward : .reverse),
        animated: true)
}

바로 그겁니다.

언급URL : https://stackoverflow.com/questions/7208871/is-it-possible-to-turn-page-programmatically-in-uipageviewcontroller

반응형