क्या UIPageViewController में प्रोग्राम को चालू करना संभव है?


जवाबों:


235

हाँ यह विधि से संभव है:

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

यह वही विधि है जिसका उपयोग पृष्ठ पर पहले दृश्य नियंत्रक को स्थापित करने के लिए किया जाता है। इसी तरह, आप इसका उपयोग अन्य पृष्ठों पर जाने के लिए कर सकते हैं।

आश्चर्य है कि viewControllersएक व्यूह क्यों है, और एक भी दृश्य नियंत्रक नहीं है?

ऐसा इसलिए है क्योंकि एक पृष्ठ दृश्य नियंत्रक में एक "रीढ़" (जैसे iBooks) हो सकता है, एक बार में 2 पृष्ठ सामग्री प्रदर्शित करता है। यदि आप एक बार में सामग्री का 1 पृष्ठ प्रदर्शित करते हैं, तो बस 1-तत्व सरणी में पास करें।

स्विफ्ट में एक उदाहरण:

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

2
अब जब NDA ऊपर है तो इसे थोड़ा और बढ़ाया जा सकता है? शायद एक कोड नमूना।
स्पेसट्रूकर

11
मुझे लगता है कि मैं अंत में इसे समझता हूं: UIPageViewController वास्तव में इस बात की परवाह नहीं करता है कि यह वर्तमान में किस पृष्ठ पर है। जब आप setViewControllers को कॉल करते हैं तो यह प्रकट हो सकता है कि आप एनिमेटेड रूप से वर्तमान दृश्य नियंत्रक से दूर नेविगेट कर रहे हैं, लेकिन यह वास्तव में एक पृष्ठ की तलाश नहीं कर रहा है।
एमी

3
उदाहरण: [स्व सेटव्यूकंट्रोलर: @ [vcToMoveTo] दिशा: UIPageViewControllerNavigationDirectionForward एनिमेटेड: YES पूरा: nil]; // जहां vcToMoveTo एक UIViewController है
finneycanhelp

1
आप UIPageControl उपयोग जारी रखना चाहते हैं, तो आप कर सकते हैं: presentationIndexForPageViewController वापसी self.currentIndex के लिए self.currentIndex = viewControllerToMoveTo के सूचकांक तो
ब्रेंडन

3
चेक stackoverflow.com/questions/22554877/... अगर आप भी पेज सूचक प्रदर्शन को अपडेट करने की जरूरत है
Protongun

37

चूंकि मुझे इसकी आवश्यकता थी, इसलिए मैं इसे और अधिक विस्तार से बताऊंगा कि यह कैसे करना है।

नोट: मुझे लगता है कि आपने अपनी UIPageViewControllerसंरचना तैयार करने के लिए मानक टेम्पलेट फॉर्म का उपयोग किया है - जो आपके द्वारा आह्वान करने पर बनाया modelViewControllerऔर dataViewControllerबनाया गया है। अगर आपको समझ में नहीं आया कि मैंने क्या लिखा है - वापस जाएं और एक नया प्रोजेक्ट बनाएं जो UIPageViewControllerइसके आधार का उपयोग करता है । तुम तब समझोगे।

तो, एक विशेष पृष्ठ पर फ्लिप करने की आवश्यकता में ऊपर सूचीबद्ध विधि के विभिन्न टुकड़े स्थापित करना शामिल है। इस अभ्यास के लिए, मैं मान रहा हूं कि यह एक दृश्य है जिसमें दो दृश्य दिखाई दे रहे हैं। इसके अलावा, मैंने इसे IBAction के रूप में लागू किया ताकि यह एक बटन प्रेस से किया जा सके या क्या नहीं - इसे चयनकर्ता कॉल करना और आवश्यक वस्तुओं में पास करना आसान है।

इसलिए, इस उदाहरण के लिए आपको दो दृश्य नियंत्रकों की आवश्यकता होगी जो प्रदर्शित होंगे - और वैकल्पिक रूप से, चाहे आप पुस्तक में आगे जा रहे हों या पीछे।

ध्यान दें कि मैंने केवल हार्ड-कोडित किया है जहां पृष्ठ 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!  

}

2
मुझे एक विशिष्ट पृष्ठ पर जाने के लिए समान आवश्यकता है। लेकिन उपरोक्त कोड मेरे लिए काम नहीं करता है। मैं क्या गलत कर रहा हूं? मेरे 19 पेज हैं।
गणेशटी

क्या हम डेटा स्रोत ऑब्जेक्ट के माध्यम से दृश्य नियंत्रक प्रदान करते समय इस कोड स्निपेट का उपयोग कर सकते हैं?
जेन्स कोहल

20
क्या एक विचित्र रूप से खराब तरीके से लागू किया गया वर्ग, Apple।
devios1

29

एक पृष्ठांकित दृश्य के लिए यहां एक और कोड उदाहरण है। ViewControllerAtIndex के लिए कार्यान्वयन यहां छोड़ दिया गया है, इसे दिए गए इंडेक्स के लिए सही व्यू कंट्रोलर वापस करना चाहिए।

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

लेकिन पेज इंडेक्स कंट्रोल अपडेट नहीं होता है। मैं उसको कैसे करू?
thatzprem

1
यह जवाब मेरे लिए काम करता है - ध्यान दें कि अगर आप UIPageViewController के "doFinishAnimating" प्रतिनिधि तरीकों पर भरोसा कर रहे हैं, तो उन्हें निकाल नहीं दिया जाएगा। इसके बजाय, अपना कोड didFinishAnimating से एक अलग विधि में ले जाएं और उस विधि को setViewControllers विधि पर पूर्ण ब्लॉक से कॉल करें।
19

1
@thatzprem आप UIPageControl उपयोग जारी रखना चाहते हैं, तो आप कर सकते हैं: self.currentIndex = viewControllerToMoveTo के presentationIndexForPageViewController वापसी self.currentIndex के लिए तो सूचकांक
ब्रेंडन

@thatzprem सही है। हर बार यह एक ही पेज पर जा रहा है। उदाहरण के लिए यदि हमारे पास 3 पेज हैं, तो हर बार यह केवल 2 पेज पर जाएगा।
तुषार लठिया

18

मैं पूरी तरह से यहां कुछ याद कर सकता हूं, लेकिन यह समाधान प्रस्तावित कई अन्य लोगों की तुलना में बहुत सरल है।

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
बहुत अच्छा काम करता है! बस आपको पेज इंडिकेटर को भी किसी तरह बदलना होगा।
TruMan1

वास्तव में मददगार! कृपया हमें goToFirstPage के लिए एक फ़ंक्शन भी दें।
ममता

हर बार यह एक ही पेज पर जा रहा है। उदाहरण के लिए यदि हमारे पास 3 पेज हैं, तो हर बार यह केवल 2 पेज पर जाएगा।
तुषार लठिया

15

इस कोड ने मेरे लिए अच्छी तरह से काम किया, धन्यवाद।

यह वही है जो मैंने इसके साथ किया था। आगे या पीछे की ओर और एक विशेष पृष्ठ पर सीधे जाने के लिए कुछ तरीके। चित्र दृश्य में इसके 6 पृष्ठ के दस्तावेज़ के लिए। यदि आप इसे PageViewController टेम्प्लेट के RootController के कार्यान्वयन में पेस्ट करते हैं तो यह ठीक काम करेगा।

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

    }

}

मैं इसे परिदृश्य मोड के लिए उपयोग करना चाहता हूं जहां दो पृष्ठ मौजूद हैं। वहाँ इसका उपयोग कैसे करें। क्या आप कृपया मार्गदर्शन कर सकते हैं
आईफोन प्रोग्रामेटिकली

9

स्विफ्ट 4:

मुझे अगले कंट्रोलर पर जाने की जरूरत है जब मैं पेजकंट्रोलर व्यू कंट्रोलर पर अगला टैप करता हूं और पेजकंट्रोल इंडेक्स को भी अपडेट करता हूं, तो यह मेरे लिए सबसे अच्छा और सीधा उपाय था :

let pageController = self.parent as! PageViewController

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

pageController.pageControl.currentPage = 1

5

डेटा स्रोत से विधियों का उपयोग करने के बारे में क्या?

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

मूल रूप से पिछड़ों के लिए।


3

में स्विफ्ट :

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
क्या आप मुझे इसके लिए पूरा उदाहरण दे सकते हैं। क्योंकि मैं कुछ इस तरह से कर रहा हूँ। मेरे कोड के साथ इस एक्सटेंशन का उपयोग कैसे करें। यदि आप चाहें तो मैं आपको कोड भेज सकता हूं।
सत्य

2

हालाँकि, इस 'self.pageViewController setViewControllers' विधि का उपयोग करने से उस पृष्ठ के दृश्य व्यू कंट्रोलर पर 'viewDidDissapear' कॉल नहीं होता है, जिसे दूर कर दिया गया है, जबकि मैन्युअल रूप से पृष्ठ को देखने से दूर किए गए पृष्ठ पर viewDissDissapear कॉल नहीं होता है। मेरा मानना ​​है कि यह मेरे दुर्घटना का कारण है

"प्रदान किए गए दृश्य नियंत्रकों की संख्या (0) अनुरोधित संक्रमण के लिए आवश्यक संख्या (1) से मेल नहीं खाती है"


उपयोग करने का प्रयास करें: - pageViewController: didFinishAnimating: पिछले दृश्य नियंत्रक: संक्रमणकंपर्कित:
ग्राहम

2

मुझे PageViewController पर बाईं ओर नेविगेट करने के लिए एक बटन की भी आवश्यकता थी, एक ऐसा करना चाहिए जो आपको स्वाइप गति से उम्मीद करता है।

चूँकि मेरे पास प्राकृतिक रूप से स्वाइप नेविगेशन से निपटने के लिए " 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];
    }
}

आप यहाँ से एक सही नेविगेशन बटन बनाने के लिए कुछ समान कर सकते हैं।


2

मामले में अगर पृष्ठ नियंत्रण वर्तमान पृष्ठ इंगित करने के लिए हे है && आप पृष्ठों स्क्रॉल के माध्यम से और भी पृष्ठ ViewController में कस्टम बटन पर क्लिक करके नेविगेट करना चाहते हैं, नीचे दिए गए सहायक हो सकता है।

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

}

// कस्टम बटन (Prev और अगला) तर्क

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

आपने चार प्रश्नों के लगभग एक ही उत्तर पोस्ट किए हैं। यदि आपको लगता है कि उनमें से एक दूसरे का डुप्लिकेट है, तो आपको उन्हें इस तरह चिह्नित करना चाहिए (और कई बार एक ही उत्तर पोस्ट नहीं करना चाहिए)।
जाप

तो क्या मैं इस प्रश्न के लिंक को अन्य समान प्रश्न पर पोस्ट कर सकता हूं लेकिन समाधान एक ही है।
योगेश लोलुसरे

1
मुझे जज या किसी भी चीज से मतलब नहीं है, लेकिन आपका कोड फॉर्मेटिंग मुझे बहुत बुरा लगता है।
लुकास पेट्र

1
सही @ लुकास, मैं इसे अभी प्रारूपित करूंगा। धन्यवाद
योगेश लोलुसरे

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

}

// अब इस विधि को कॉल करें

[सेल्फ मूवमेंट];

मैं आशा करता हूँ यह काम करेगा :)


1

सिंगल पेज के लिए, मैंने सिर्फ @ जेक हम्फ्रीज के उत्तर को संपादित किया

-(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 ने बताया, पेजिंग का तरीका इस्तेमाल करने से है

setViewControllers:array

यहां मैंने ऐसा किया है: मेरे पास मेरे डेटा स्रोत और प्रतिनिधि अलग हैं। आप इस पद्धति को कॉल कर सकते हैं और केवल "अगला" दृश्य बदल सकते हैं। पहले आपको पेजिंग नियमों को लागू करना होगा। यही है, आपको दिशा और अगले नियंत्रक की जांच करनी होगी। यदि आप अपने कस्टम डेटा स्रोत के साथ उस विधि का उपयोग करते हैं, तो आपके द्वारा प्रदर्शित किए जाने वाले नियंत्रकों की सरणी नहीं बदलेगी (क्योंकि आप NSObject उपवर्ग पर कस्टम सरणी का उपयोग करेंगे)।

अपने स्वयं के डेटा स्रोत का उपयोग करके विधि केवल एक नया दृश्य (विशिष्ट दिशा के साथ) सेट करती है। चूंकि आप अभी भी उन पृष्ठों को नियंत्रित करेंगे जो सामान्य रूप से स्वाइप करने पर प्रदर्शित होंगे।


0

मैं कल से इस पर काम कर रहा हूं और मैंने आखिरकार यह काम किया। मैं पूरी तरह से मानक टेम्पलेट का उपयोग नहीं कर सका, क्योंकि मेरे पास तीन अलग-अलग दृश्य हैं जो चाइल्डव्यू के रूप में हैं।

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

मुझे केवल पहले एक कुलपति में एक ट्रिगर बटन की आवश्यकता थी, इसलिए मैंने पेज व्यू कॉन्ट्रोलर और मॉडल के लिए एक संपत्ति जोड़ी:

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

@interface VC1 : UIViewController

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

@end

मैंने स्टोरीबोर्ड और पेज व्यूकंट्रोलर को मापदंडों के रूप में पारित करने के लिए मॉडल की इनिट विधि को फिर से लिखा है, इसलिए मैं उन लोगों को अपने वीसी 1 में सेट कर सकता हूं:

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

अंत में, मैं pageViewController विधि को गति प्रदान करने के लिए अपने VC1 में एक IBAction जोड़ा setViewControllers: दिशा: एनिमेटेड: पूरा होने: :

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

ध्यान दें कि मुझे कुलपतियों के अनुक्रमित को खोजने की आवश्यकता नहीं है, मेरा बटन मुझे मेरे दूसरे कुलपति के पास ले जाता है, लेकिन इसकी सभी सूचियाँ कठिन नहीं हैं, और अपने बच्चों के साक्षात्कार का ध्यान रखें:

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

मुझे उम्मीद है इससे आपको मदद मिली होगी!


0

यहाँ UIPageViewControllerDataSource विधियों का उपयोग करके एक समाधान दिया गया है:

कोड UIPageViewController में वर्तमान प्रदर्शित दृश्य नियंत्रक का ट्रैक रखता है ।

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

सबसे पहले प्रारंभ currentViewController के आरंभिक दृश्य नियंत्रक सेट करने के लिए UIPageViewController

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

तब का ट्रैक रखने currentViewController में UIPageViewControllerDelegate : तरीकों pageViewController: willTransitionToViewControllers: और 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;
    }
}

अंत में, अपने पसंद की विधि में (यह नीचे दिए गए उदाहरण में -) (IBAction onNext: (आईडी) इस ), आप प्रोग्राम अगले या पिछले नियंत्रक का उपयोग करने के लिए स्विच कर सकते हैं UIPageViewControllerDataSouce तरीकों : viewControllerBeforeViewController: pageViewController , pageViewController: viewControllerAfterViewController: प्राप्त करने के लिए अगला या प्रचलित दृश्य नियंत्रक और [self.pageViewController setViewControllers: @ [vc] दिशा: UIPageViewControllerNavigationDirectionForward एनिमेटेड: YES पूर्ण: 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];
    }
}

एक विस्तृत विवरण बहुत उपयोगी होता।
तस्लीम ओसेनी

@TaslimOseni यह बताने के लिए धन्यवाद कि उदाहरण पर्याप्त रूप से स्पष्ट नहीं था। मैंने इसका वर्णन किया कि यह कैसे काम करता है, कृपया मुझे बताएं कि क्या इसे और स्पष्टीकरण की आवश्यकता है।
पोकॉन

0

जैसा कि ViewControllers PageViewController में एम्बेडेड हैं, आपको बस इतना करना है:

  • मूल दृश्य नियंत्रक को पुनः प्राप्त करें और अपने संबंधित वर्ग के रूप में कास्ट करें।
  • अगले ViewController पाने के लिए माता-पिता डेटा स्रोत का उपयोग करें।
  • अगले पृष्ठ पर सेट और संक्रमण करने के लिए SetParentViewControllers विधि का उपयोग करें।

Xamarin में उदाहरण, लेकिन कार्यात्मक रूप से स्विफ्ट आदि के समान। निम्नलिखित कोड बटन में होगा क्लिक करें प्रतिनिधि को एक पृष्ठ के रूप में दिखाया जा रहा है ViewControllers में प्रतिनिधि:

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

parent.SetViewControllers(new UIViewController[] { next }, UIPageViewControllerNavigationDirection.Forward, true, null);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.