UIPageViewController'da sayfayı programlı olarak çevirmek mümkün mü?


Yanıtlar:


235

Evet, yöntemle mümkündür:

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

Bu, sayfadaki ilk görünüm denetleyicisini ayarlamak için kullanılan yöntemle aynıdır. Benzer şekilde, diğer sayfalara gitmek için de kullanabilirsiniz.

Merak ediyorum neden viewControllerstek bir görünüm denetleyicisi değil bir dizi?

Bunun nedeni, sayfa görüntüleme denetleyicisinin bir kerede 2 sayfa görüntüleyen "omurga" (iBooks'ta olduğu gibi) olabilmesidir. Bir seferde 1 sayfa içerik görüntülüyorsanız, yalnızca 1 öğeli bir dizi iletin.

Swift'te bir örnek:

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

2
Şimdi NDA bittiğine göre bu biraz daha genişletilebilir mi? Belki bir kod örneği.
SpaceTrucker

11
Sonunda bunu anlıyorum: UIPageViewController şu anda hangi sayfada olduğunu gerçekten umursamıyor. SetViewControllers'ı çağırdığınızda, geçerli görünüm denetleyicisinden animasyonlu olarak uzaklaştığınızı gösterebilir, ancak gerçekten bir sayfa aramaz.
Amy

3
örnek: [self setViewControllers: @ [vcToMoveTo] yön: UIPageViewControllerNavigationDirectionForward animated: YES tamamlama: nil]; // burada vcToMoveTo bir UIViewController
finneycanhelp

1
UIPageControl kullanmaya devam etmek istiyorsanız, şunu isteyebilirsiniz: self.currentIndex = viewControllerToMoveTo'nun dizini sonra sunumu içinIndexForPageViewController return self.currentIndex
Brendan

3
Kontrol stackoverflow.com/questions/22554877/... ayrıca sayfa gösterge ekranı güncellemek gerekirse
Protongun

37

Buna da ihtiyaç duyduğumdan, bunun nasıl yapılacağı hakkında daha fazla ayrıntıya gireceğim.

Not: Ben size üretmek için standart şablon formunu kullanılan varsayalım UIPageViewController- olan hem yapısını modelViewControllerve dataViewControllerbunun çağırmak zaman sizi yarattı. Ne yazdığımı anlamıyorsanız - geri dönün ve UIPageViewControllertemeli olarak kullanan yeni bir proje oluşturun. O zaman anlayacaksın.

Bu nedenle, belirli bir sayfaya dönme ihtiyacı, yukarıda listelenen yöntemin çeşitli parçalarını ayarlamayı içerir. Bu alıştırma için, iki görünüm gösteren yatay bir manzara olduğunu varsayıyorum . Ayrıca, bir IBAction olarak bir düğmeye basarak ya da ne yapılamayacak şekilde uyguladım - seçici aramayı yapmak ve gerekli öğeleri iletmek de o kadar kolay.

Bu nedenle, bu örnek için görüntülenecek iki görünüm denetleyicisine ihtiyacınız vardır - ve isteğe bağlı olarak, kitapta ileri veya geri giderseniz.

Sayfa 4 ve 5'e nereye gideceğimi ve ileri bir fiş kullandığımı sadece kodladığımı unutmayın. Buradan, tüm yapmanız gereken bu öğeleri almanıza yardımcı olacak değişkenleri geçmek olduğunu görebilirsiniz ...

-(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!  

}

2
Belirli bir sayfaya gitmek için aynı gereksinime sahibim. Ancak yukarıdaki kod benim için çalışmıyor gibi görünüyor. Neyi yanlış yapıyorum? 19 sayfam var.
GaneshT

Bu kod snippet'ini, görünüm denetleyicilerine bir veri kaynağı nesnesi aracılığıyla sağlarken de kullanabilir miyiz?
Jens Kohl

20
Ne tuhaf kötü uygulanmış bir sınıf Apple.
devios1

29

Aşağıda, tek bir sayfalı görünüm için başka bir kod örneği verilmiştir. ViewControllerAtIndex için uygulama burada atlanır, verilen dizin için doğru görünüm denetleyicisini döndürmelidir.

- (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];
}

Sayfalar çağrılarak değiştirilebilir

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

Ancak sayfa dizini denetimi güncellenmiyor. Bunu nasıl yaparım?
thatzprem

1
Bu cevap benim için çalışıyor - ancak UIPageViewController "didFinishAnimating" delege yöntemlerine güveniyorsanız, onlar ateş olmayacak unutmayın. Bunun yerine, kodunuzu didFinishAnimating'ten ayrı bir yönteme taşıyın ve bu yöntemi setViewControllers yöntemindeki tamamlama bloğundan çağırın.
DiscDev

1
Eğer UIPageControl kullanmaya devam etmek istiyorsanız @thatzprem, o zaman isteyebilirsiniz: presentationIndexForPageViewController dönüş self.currentIndex için daha sonra self.currentIndex = viewControllerToMoveTo indeksi
Brendan

@thatzprem haklı. Her seferinde aynı sayfaya gidecektir. Örneğin 3 sayfamız varsa, her seferinde sadece 2. sayfaya gidecektir.
Tushar Lathiya

18

Burada bir şey eksik olabilirim, ama bu çözüm diğerlerinin önerdiğinden çok daha basit görünüyor.

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)
            }
        }
    }
}

1
Harika çalışıyor! Sadece sayfa göstergesini bir şekilde değiştirmek zorundasınız.
TruMan1

Gerçekten yardımcı! Lütfen bize goToFirstPage için de bir işlev verin.
Mamta

Her seferinde aynı sayfaya gidecek. Örneğin 3 sayfamız varsa, her seferinde sadece 2. sayfaya gidecek.
Tushar Lathiya

15

Bu kod benim için iyi çalıştı, teşekkürler.

Ben onunla yaptım. İleri veya geri adım atmanın ve doğrudan belirli bir sayfaya gitmenin bir yöntemi. Onun portre görünümünde 6 sayfalık bir belge için. Eğer pageViewController şablonunun RootController uygulamasına yapıştırırsanız tamam çalışır.

-(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];

    }

}

iki sayfanın bulunduğu manzara modu için kullanmak istiyorum. orada nasıl kullanılır. lütfen yönlendirir misiniz.
iPhone Programlı olarak

9

Hızlı 4:

Ben bir pagecontroller görünüm denetleyicisi üzerinde sonraki dokunun ve ayrıca pageControl dizini güncellediğinizde sonraki denetleyiciye gitmek gerekiyordu, bu yüzden bu benim için en iyi ve en basit çözüm oldu :

let pageController = self.parent as! PageViewController

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

pageController.pageControl.currentPage = 1

5

DataSource'taki yöntemleri kullanmaya ne dersiniz?

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

Geriye doğru analog olarak.


3

In 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
        }
    }

}

1
Bunun için bana tam bir örnek verebilir misiniz? Çünkü böyle bir şey yapıyorum. Bu uzantı kodumla nasıl kullanılır? İsterseniz size kodu gönderebilirim.
Saty

2

Ancak bu 'self.pageViewController setViewControllers' yöntem çağrısı, kapatılan sayfa için viewController'da 'viewDidDissapear'ı çağırmazken, bir sayfayı manuel olarak çevirmek, geri çevrilen sayfada viewDidDissapear'ı çağırır. Bence bu çöküşümün sebebi

"Sağlanan görüntüleme denetleyicilerinin sayısı (0), istenen geçiş için gereken sayıyla (1) eşleşmiyor"


kullanmayı deneyin: - pageViewController: didFinishAnimating: previousViewControllers: transitionCompleted:
Graham

2

Ben de bir tokatlamak hareket beklediğiniz tam olarak ne yapmalı bir PageViewController sola gitmek için bir düğmeye ihtiyacım vardı.

Doğal kaydırma gezinme ile uğraşmak için zaten " pageViewController: viewControllerBeforeViewController " içinde yer alan birkaç kuralım olduğundan , düğmenin tüm bu kodu yeniden kullanmasını istedim ve sadece belirli dizinleri kullanmayı göze alamamıştım ve önceki sayfalara ulaşmak cevaplar yaptı. Bu yüzden alternatif bir çözüm almak zorunda kaldım.

Aşağıdaki kodun, özel ViewController'ım içindeki bir özellik olan ve omurgası orta olarak ayarlanmış bir Sayfa Görüntüleme Denetleyicisi için olduğunu unutmayın.

Sola Git düğmem için yazdığım kod:

- (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];
    }
}

Buradan doğru bir gezinti düğmesi yapmak için çok benzer bir şey yapabilirsiniz.


2

Durumda && Sen sayfalar kaydırma yaparak ve ayrıca Sayfa viewController özel düğmelerini tıklayarak gezinmek istiyor O SAYFA KONTROL geçerli sayfayı belirtmek için, lütfen aşağıdaki yararlı olabilir.

//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];        
}

// Kullanıcı bir sonraki sayfaya geçtiğinde viewControllerAfterViewController adlı temsilci

- (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;
}

}

// Özel düğmelerin (Önceki ve sonraki) Mantık

-(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;}

Dört soruya hemen hemen aynı cevabı gönderdiniz. Bunlardan birinin diğerinin kopyası olduğunu düşünüyorsanız, bunları böyle işaretlemelisiniz (ve aynı cevabı birkaç kez göndermemelisiniz).
Jaap

Bu sorunun bağlantısını diğer benzer soruların üzerine de gönderebilirim ama çözüm aynı.
Yogesh Lolusare

1
Yargılamak ya da başka bir şey demek istemiyorum, ama kod biçimlendirmeniz bana çok rahatsız edici görünüyor.
Lukas Petr

1
Right @Lukas, şimdi biçimlendireceğim. Teşekkürler
Yogesh Lolusare

2
- (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];

}

// şimdi bu yöntemi çağırın

[self moveToPage];

Umarım işe yarar :)


1

Tek sayfa için @Jack Humphries'in cevabını yeni düzenledim

-(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];
}

0

@Samwize'in işaret ettiği gibi, sayfalandırma yöntemi

setViewControllers:array

İşte bunu yaptım: Veri kaynağım ve temsilci ayrı. Bu yöntemi çağırabilir ve yalnızca "sonraki" görünümünü değiştirebilirsiniz. Önceden sayfalama kurallarını uygulamanız gerekiyordu. Yani, yönü ve bir sonraki denetleyiciyi kontrol etmelisiniz. Bu yöntemi özel veri kaynağınızla kullanırsanız, görüntülemekte olduğunuz denetleyici dizisi değişmez (çünkü bir NSObject alt sınıfında özel bir dizi kullanacaksınız).

Kendi veri kaynağınızı kullanarak yöntem sadece yeni bir görünüm belirler (belirli bir yönde). Normalde kaydırırken görüntülenecek sayfaları hala kontrol edeceğiniz için.


0

Dünden beri üzerinde çalışıyorum ve sonunda çalıştım. Tamamen standart şablonu kullanamadım, çünkü üç farklı viewController'ım var:

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

Ben sadece ilk bir VC tetik düğmesi gerekli, bu yüzden pageViewController ve model için bir özellik ekledi:

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

@interface VC1 : UIViewController

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

@end

Modelin init yöntemini storyboard ve pageViewController'ı parametre olarak iletmek için yeniden yazdım, böylece bunları VC1'ime ayarlayabilirim:

- (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;
}

Son olarak, pageViewController yöntem tetiklemek için zaman VC1 bir IBAction ilave setViewControllers: yönü: animasyon: tamamlama: :

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

Not VC dizinleri bulmam gerekmiyor, düğmem beni ikinci VC'ye götürüyor, ancak zor değil tüm dizinleri almak ve çocuk görüşlerinizi takip etmek:

- (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];
}

Umarım sana yardımcı olur!


0

İşte UIPageViewControllerDataSource yöntemlerini kullanan bir çözüm :

Kod, UIPageViewController'da görüntülenen geçerli denetleyiciyi izler .

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

İlk olarak currentViewController'ı UIPageViewController için ayarlanan ilk görünüm denetleyicisine başlatın .

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

Sonra takip currentViewController içinde UIPageViewControllerDelegate : yöntemlerle pageViewController: willTransitionToViewControllers: ve pageViewController: didFinishAnimating: previousViewControllers: 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;
    }
}

Son olarak, ( 's aşağıdaki örnekte seçtiğiniz yönteminde - (IBAction) OnNext: (id) gönderen ), programlı kullanarak bir sonraki veya önceki denetleyiciye geçiş yapabilirsiniz UIPageViewControllerDataSouce yöntemleri : viewControllerBeforeViewController: pageViewController , pageViewController: viewControllerAfterViewController: almak sonraki veya önceki görünüm denetleyicisini seçin ve [self.pageViewController setViewControllers: @ [vc] yönünü çağırarak ona gidin : UIPageViewControllerNavigationDirectionForward 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];
    }
}

Ayrıntılı bir açıklama çok faydalı olurdu.
Taslim Oseni

@TaslimOseni, örneğin yeterince açık olmadığını belirttiğiniz için teşekkürler. Nasıl çalıştığının açıklamasını ekledim, lütfen daha fazla açıklamaya ihtiyacı olup olmadığını bildirin.
pconor

0

ViewControllers PageViewController gömülü olduğundan tek yapmanız gereken:

  • Üst görünüm denetleyicisini alın ve ilgili sınıfınız olarak yayınlayın.
  • Sonraki ViewController'ı almak için ebeveynlerin datasource özelliğini kullanın.
  • Sonraki sayfaya geçmek ve bir sonraki sayfaya geçmek için SetParentViewControllers yöntemini kullanın.

Xamarin'de örnek, ancak Swift vb. Olarak işlevsel olarak benzer. Aşağıdaki kod, sayfa olarak gösterilen ViewController'lardan birinde Button Click temsilcisine ait olacaktır:

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

parent.SetViewControllers(new UIViewController[] { next }, UIPageViewControllerNavigationDirection.Forward, true, null);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.