ইউআইপেজভিউকন্ট্রোলারটিতে প্রোগ্রামটিমে পৃষ্ঠাটি ঘুরিয়ে দেওয়া কি সম্ভব?


161

প্রোগ্রামটিমেটিকভাবে পৃষ্ঠাটি চালু করা কি সম্ভব UIPageViewController?


1
আপনি কি দয়া করে এর জন্য কোনও উদাহরণ কোড পোস্ট করতে পারেন? আপনাকে ধন্যবাদ।
আইফোন প্রোগ্রামে

উত্তর:


235

হ্যাঁ পদ্ধতি দ্বারা এটি সম্ভব:

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

পৃষ্ঠায় প্রথম দর্শন নিয়ামক সেটআপ করার জন্য এটি একই পদ্ধতি ব্যবহৃত হয়। অনুরূপ, আপনি অন্যান্য পৃষ্ঠাগুলিতে যেতে এটি ব্যবহার করতে পারেন।

ভাবছেন কেন viewControllersএকটি অ্যারে, এবং একক দর্শন নিয়ামক নয়?

এটি কারণ একটি পৃষ্ঠার ভিউ কন্ট্রোলারের একটি "মেরুদণ্ড" থাকতে পারে (আইবুকগুলির মতো), যা একবারে 2 পৃষ্ঠার সামগ্রী প্রদর্শন করে। আপনি যদি একসাথে 1 পৃষ্ঠার সামগ্রী প্রদর্শন করেন তবে কেবল 1-উপাদান অ্যারেতে পাস করুন।

সুইফটে একটি উদাহরণ:

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

2
এখন যে এনডিএ আছে এটি আরও কিছুটা বাড়ানো যেতে পারে? হতে পারে একটি কোড নমুনা।
স্পেসট্রকার

11
আমি মনে করি আমি শেষ পর্যন্ত এটি বুঝতে পেরেছি: ইউআইপেজভিউ কনট্রোলার বর্তমানে কোন পৃষ্ঠাটিতে রয়েছে সে সম্পর্কে সত্যই চিন্তা করে না। আপনি যখন সেটভিউ কনট্রোলারদের কল করেন তখন এটি উপস্থিত হয়ে উঠতে পারে যে আপনি অ্যানিমেটেডভাবে বর্তমান ভিউ কন্ট্রোলার থেকে দূরে সরে যাচ্ছেন, তবে এটি সত্যিই কোনও পৃষ্ঠায় সন্ধান করছে না।
অ্যামি

3
উদাহরণ: [স্ব-সেটভিউকন্ট্রোলার্স: @ [ভিসিটোমোভটো]] দিকনির্দেশ: ইউআইপেজভিউ কনট্রোলার নেভিগেশন নির্দেশিকা ফরোয়ার্ড অ্যানিমেটেড: হ্যাঁ সমাপ্তি: শূন্য]; // যেখানে ভিসিটিওমোভটো একটি
ইউআইভিউকন্ট্রোলার

1
আপনি UIPageControl ব্যবহার করা চালিয়ে যেতে চান, তাহলে আপনি চান করতে পারেন: presentationIndexForPageViewController আগমন self.currentIndex জন্য self.currentIndex = viewControllerToMoveTo এর সূচীতে তারপর
ব্রেন্ডন

3
পরীক্ষা করে দেখুন stackoverflow.com/questions/22554877/... করেন তাহলে আপনি পৃষ্ঠা নির্দেশক প্রদর্শন আপডেট করতে হবে
Protongun

37

যেহেতু আমারও এটির প্রয়োজন ছিল, আমি এটি কীভাবে করব সে সম্পর্কে আরও বিশদে যাব।

দ্রষ্টব্য: আমি ধরে নিয়েছি যে আপনি আপনার UIPageViewControllerকাঠামো তৈরির জন্য স্ট্যান্ডার্ড টেম্পলেট ফর্মটি ব্যবহার করেছেন - যা আপনি যখন প্রার্থনা করেন তখন উভয়ই তৈরি modelViewControllerএবং dataViewControllerতৈরি হয়েছিল। আমি কী লিখেছি তা যদি আপনি বুঝতে না পারেন - ফিরে যান এবং একটি নতুন প্রকল্প তৈরি করুন UIPageViewControllerযা এটির ভিত্তি হিসাবে ব্যবহার করে । আপনি তখন বুঝতে পারবেন।

সুতরাং, একটি নির্দিষ্ট পৃষ্ঠায় ফ্লিপ করা প্রয়োজন উপরে তালিকাভুক্ত পদ্ধতি বিভিন্ন টুকরা সেট আপ জড়িত। এই অনুশীলনের জন্য, আমি ধরে নিচ্ছি যে এটি একটি ল্যান্ডস্কেপ দৃশ্য যা দুটি দর্শন দেখিয়েছে। এছাড়াও, আমি এটি আইবিএএকশন হিসাবে প্রয়োগ করেছি যাতে এটি একটি বোতাম প্রেস থেকে করা যায় বা কী হয় না - এটি নির্বাচককে কল করা এবং প্রয়োজনীয় আইটেমগুলিতে পাস করা ঠিক তত সহজ।

সুতরাং, এই উদাহরণের জন্য আপনার দুটি ভিউ কন্ট্রোলার দরকার যা প্রদর্শিত হবে - এবং optionচ্ছিকভাবে আপনি বইতে বা পিছনের দিকে এগিয়ে যাচ্ছেন কিনা।

মনে রাখবেন যে আমি যেখানে কেবল পৃষ্ঠা 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
কী বিচিত্রভাবে খারাপভাবে প্রয়োগ করা ক্লাস, অ্যাপল।
ডিভাইস 1

29

একক পেজযুক্ত দর্শনের জন্য এখানে আরও একটি কোড উদাহরণ রয়েছে। ভিউকন্ট্রোলারএটিআইডেক্সের বাস্তবায়ন এখানে বাদ দেওয়া হয়েছে, প্রদত্ত সূচকের জন্য এটি সঠিক দর্শন নিয়ন্ত্রককে ফিরিয়ে আনতে হবে।

- (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
এই উত্তরটি আমার পক্ষে কাজ করে - তবে মনে রাখবেন যে আপনি যদি ইউআইপিএজভিউ কনট্রোলারের "ডিডফিনিশআনিমেটিং" প্রতিনিধি পদ্ধতির উপর নির্ভর করে থাকেন তবে তাদের বরখাস্ত করা হবে না। পরিবর্তে, ডি কোডফিনিশ অ্যানিমেশন থেকে আপনার কোডটি একটি পৃথক পদ্ধতিতে সরান এবং সেটভিউকন্ট্রোলার্স পদ্ধতিতে সম্পূর্ণ হওয়া ব্লক থেকে সেই পদ্ধতিটি কল করুন।
ডিস্কদেভ

1
@thatzprem আপনি UIPageControl ব্যবহার করা চালিয়ে যেতে চান, তাহলে আপনি চান করতে পারেন: self.currentIndex = viewControllerToMoveTo এর presentationIndexForPageViewController আগমন self.currentIndex জন্য তারপর সূচক
ব্রেন্ডন

পছন্দ করুন প্রতিবার এটি একই পৃষ্ঠাতে চলেছে For উদাহরণস্বরূপ যদি আমাদের 3 টি পৃষ্ঠা থাকে তবে প্রতিবার এটি কেবল ২ য় পৃষ্ঠায় যাবে।
তুষার লাঠিয়া

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

সত্যিই সহায়ক! দয়া করে আমাদের GoToFrstPage এর জন্যও একটি ফাংশন দিন।
মমতা

প্রতিবার এটি একই পৃষ্ঠাতে চলেছে For উদাহরণস্বরূপ যদি আমাদের 3 টি পৃষ্ঠা থাকে তবে প্রতিবার এটি কেবল ২ য় পৃষ্ঠায় যাবে।
তুষার লাঠিয়া

15

এই কোডটি আমার জন্য সুন্দরভাবে কাজ করেছে, ধন্যবাদ।

এটি আমি এটি দিয়ে কি করেছি। সামনে বা পিছনের দিকে পা বাড়ানোর জন্য কয়েকটি পদ্ধতি এবং একটি নির্দিষ্ট পৃষ্ঠায় সরাসরি যাওয়ার জন্য একটি। এটি প্রতিক্রিয়া দর্শনে 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];

    }

}

আমি ল্যান্ডস্কেপ মোডে এটি ব্যবহার করতে চাই যেখানে দুটি পৃষ্ঠাগুলি বিদ্যমান। সেখানে এটি কীভাবে ব্যবহার করবেন। আপনি দয়া করে গাইড করতে পারেন?
আইফোন প্রোগ্রামেমিকভাবে

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

তবে এই 'সেলফ.পেজভিউ কনট্রোলার সেটভিউ কনট্রোলারস' পদ্ধতি কলটি যে পৃষ্ঠাটি সরে গেছে তার জন্য ভিউকন্ট্রোলারে 'ভিউডিডডিস্পায়ার' কল করে না, যেখানে ম্যানুয়ালি একটি পৃষ্ঠা ঘুরিয়ে সরিয়ে ফেলা পৃষ্ঠায় কলটি ভিডিডিসিপায়ার কল করে। আমি বিশ্বাস করি এটিই আমার ক্রাশের কারণ

"প্রদত্ত ভিউ কন্ট্রোলারের সংখ্যা (0) অনুরোধকৃত উত্তরণের জন্য প্রয়োজনীয় সংখ্যার (1) এর সাথে মেলে না"


ব্যবহার করে দেখুন: - পৃষ্ঠাভিউ কনট্রোলার: ডিনফিনিশআনিমেটিং: পূর্ববর্তী ভিউ কনট্রোলারস: ট্রান্সজিশন কমপ্লিটড:
গ্রাহাম

2

পেজভিউ কনট্রোলারের বামে নেভিগেট করার জন্য আমারও একটি বোতামের দরকার ছিল, এটি যেটি সোয়াইপ মোশন থেকে আপনি যা প্রত্যাশা করবেন ঠিক তা করা উচিত।

যেহেতু প্রাকৃতিক সোয়াইপ নেভিগেশন নিয়ে কাজ করার জন্য আমার " পৃষ্ঠাভিউ কনট্রোলার: ভিউকন্ট্রোলারবিফরভিউকন্ট্রোলার " এর ভিতরে ইতিমধ্যে কয়েকটি নিয়ম ছিল , আমি বোতামটি সমস্ত কোডটি পুনরায় ব্যবহার করতে চেয়েছিলাম এবং কেবল নির্দিষ্ট সূচী ব্যবহার করার সামর্থ ছিল না পূর্বের মতো পৃষ্ঠাগুলিতে পৌঁছানোর উত্তরগুলি দিয়েছিল। সুতরাং, আমাকে একটি বিকল্প সমাধান নিতে হয়েছিল।

দয়া করে নোট করুন যে নিম্নলিখিত কোডটি আমার পৃষ্ঠা কাস্টম ভিউ কনট্রোলারের অভ্যন্তরের একটি পৃষ্ঠা ভিউ কন্ট্রোলারের জন্য এবং এর মেরুদণ্ডটি মাঝখানে সেট করা আছে।

আমার নেভিগেট বাম বোতামের জন্য আমি লিখেছি কোডটি এখানে:

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

// ব্যবহারকারী যখন পরবর্তী পৃষ্ঠায় স্ক্রোল করেন তখন ডেলিগেটকে ভিউকন্ট্রোলারএফটারভিউ কনট্রোলার বলা হয়

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

আপনি চারটি প্রশ্নের প্রায় একই উত্তর পোস্ট করেছেন। যদি আপনি মনে করেন যে এগুলির একটির অপরটির সদৃশ, আপনার তাদের অবশ্যই এটি চিহ্নিত করা উচিত (এবং একই উত্তরটি বেশ কয়েকবার পোস্ট করবেন না)।
জাপ

সুতরাং আমি কি অন্যান্য অনুরূপ প্রশ্নের উপরে এই প্রশ্নের লিঙ্ক পোস্ট করতে পারি তবে সমাধানটি একই।
যোগেশ ললুসারে

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

@ সাম্বাইজ হিসাবে উল্লেখ করা হয়েছে যে, প্যাগটিংয়ের উপায়টি ব্যবহার করে

setViewControllers:array

আমি এটি করার উপায়টি এখানে: আমার আমার ডেটা সোর্স এবং প্রতিনিধি আলাদা। আপনি এই পদ্ধতিটি কল করতে পারেন এবং কেবল "পরবর্তী" দর্শন পরিবর্তন করতে পারেন। আগে আপনাকে পেজিং বিধি প্রয়োগ করতে হবে। অর্থাৎ আপনাকে দিকনির্দেশ এবং পরবর্তী নিয়ামকটি পরীক্ষা করতে হবে। যদি আপনি সেই পদ্ধতিটি আপনার কাস্টম ডেটাসোর্সের সাথে ব্যবহার করেন তবে আপনি যে কন্ট্রোলারগুলির প্রদর্শন করছেন তা পরিবর্তন হবে না (যেহেতু আপনি কোনও এনএসবজেক্ট সাবক্লাসে একটি কাস্টম অ্যারে ব্যবহার করবেন)।

আপনার নিজস্ব ডেটাসোর্স ব্যবহার করে পদ্ধতিটি একটি নতুন দর্শন সেট করে (নির্দিষ্ট দিকনির্দেশ সহ)। যেহেতু আপনি এখনও পৃষ্ঠাগুলি নিয়ন্ত্রণ করবেন যা সাধারণত সোয়াইপ করার সময় প্রদর্শিত হবে।


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

অবশেষে, পৃষ্ঠা ভিউকন্ট্রোলার পদ্ধতি সেটভিউকন্ট্রোলারগুলি: নির্দেশ: অ্যানিমেটেড: সমাপ্তি ::

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

ইউআইপেজভিউ কনট্রোলারডেটা সোর্স পদ্ধতিগুলি ব্যবহার করে এখানে একটি সমাধান দেওয়া হয়েছে :

কোডটি ইউআইপিএজভিউ কনট্রোলারটিতে বর্তমান প্রদর্শিত ভিউ কন্ট্রোলারের উপর নজর রাখে ।

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

প্রথমে কারেন্টভিউ কন্ট্রোলারটিকে ইউআইপেজভিউ কনট্রোলারের জন্য প্রাথমিক ভিউ কন্ট্রোলার সেটটিতে সূচনা করুন

- (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: (ID) প্রেরক ), আপনি প্রোগ্রামের মাধ্যমে পরবর্তী বা পূর্ববর্তী নিয়ামক ব্যবহার করার সুইচ করতে পারেন UIPageViewControllerDataSouce পদ্ধতি : viewControllerBeforeViewController: pageViewController , pageViewController: viewControllerAfterViewController: পেতে পরবর্তী বা পূর্ববর্তী ভিউ কন্ট্রোলার এবং [সেলফেজ.উইজকন্ট্রোলার সেটভিউ কনক্রোলার্স: @ [ভিসি] দিকনির্দেশ: ইউআইপেজভিউ কনট্রোলার নেভিগেশন নির্দেশিকা ফরওয়ার্ড অ্যানিমেটেড: হ্যাঁ সমাপ্তি: শূন্য] কল করে এটিতে নেভিগেট করুন ;


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

একটি বিস্তারিত ব্যাখ্যা খুব দরকারী হবে।
তাসলিম ওসেনি

@ তসলিম ওসেনি উদাহরণটি যথেষ্ট পরিষ্কার ছিল না তা উল্লেখ করার জন্য ধন্যবাদ। আমি এটি কীভাবে কাজ করে তার বিবরণ যুক্ত করেছি, যদি এর আরও ব্যাখ্যা প্রয়োজন হয় তবে দয়া করে আমাকে জানান।
পিকনর

0

যেমন ভিউকন্ট্রোলাররা পেজভিউ কনট্রোলারটিতে এম্বেড থাকে আপনার যা করতে হবে তা হ'ল:

  • প্যারেন্ট ভিউ কন্ট্রোলারটি পুনরুদ্ধার করুন এবং আপনার প্রাসঙ্গিক শ্রেণী হিসাবে কাস্ট করুন।
  • পরবর্তী ভিউ নিয়ন্ত্রণকারী পেতে পিতামাতাদের ডেটাসোর্স সম্পত্তি ব্যবহার করুন।
  • পরবর্তী পৃষ্ঠায় সেট এবং রূপান্তর করতে সেটপেন্টভিউকন্ট্রোলার পদ্ধতিটি ব্যবহার করুন।

জামারিনে উদাহরণ, তবে কার্যত সুইফট ইত্যাদির মতোই অনুরূপ: নিম্নলিখিত কোডটি বোতামে ক্লিক করা হবে ভিউকন্ট্রোলারগুলির মধ্যে একটিতে পৃষ্ঠা হিসাবে দেখানো হচ্ছে:

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

parent.SetViewControllers(new UIViewController[] { next }, UIPageViewControllerNavigationDirection.Forward, true, null);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.