ইউআইপেজভিউ কনট্রোলার: বর্তমান দৃশ্যমান দর্শনটি ফিরিয়ে দিন


89

আপনি কীভাবে জানবেন যে কোনওটির ভিতরে প্রদর্শিত বর্তমান পৃষ্ঠা / দৃশ্যটি UIPageViewControllerকী?

আমি viewDidAppearআমার সন্তানের দর্শনগুলির পদ্ধতিটি ওভাররাইড করেছি, যাতে তারা তাদের viewDidAppearপদ্ধতিতে পিতামাতার ভিউতে কোনও আইডি প্রেরণ করে ।

তবে সমস্যাটি হ'ল: আমি প্রদর্শিত আইডি হিসাবে নির্ভরযোগ্যভাবে প্রদর্শিত পৃষ্ঠার জন্য আইডি হিসাবে ব্যবহার করতে পারি না। কারণ যদি ব্যবহারকারী পৃষ্ঠাটি ঘুরিয়ে দেয় তবে অর্ধেকের মধ্যে আপনি বাঁক বন্ধ করে পৃষ্ঠাটি পিছনে রাখার সিদ্ধান্ত নেন তবে viewDidAppearইতিমধ্যে ডাকা হবে। (কার্ল পৃষ্ঠার পিছনে দৃশ্যটি দৃশ্যমান))

সম্ভবত বর্তমান ভিউটি অদৃশ্য হয়ে গেলে আমার কেবল নতুন আইডিতে স্যুইচ করা উচিত। তবে আমি অবাক হই যে, বর্তমানে দৃশ্যমান যে দৃশ্যটি ফেরত দেওয়ার আরও সহজ উপায় নেই?


আপনি কি viewDidAppear:animated:পরিবর্তে ব্যবহার করার চেষ্টা করেছেন ?
পর্যন্ত

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

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

দুঃখিত, আমি প্রশ্নটি সম্পাদন করতে খারাপ কাজ করেছি। আমি সব সাথে ভিউডিড অ্যাপ ব্যবহার করেছি। আমি আশা করি আমার শেষ সম্পাদনাটি এটি পরিষ্কার করে দিয়েছে।
জানুয়ারী

এখানে কটাক্ষপাত বলছি আমার জন্য এই কাজ stackoverflow.com/a/36860663/4286947
theDC

উত্তর:


104

আপনার ম্যানুয়ালি বর্তমান পৃষ্ঠার ট্র্যাক রাখা উচিত।

প্রতিনিধি পদ্ধতি pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:আপনাকে জানায় যে কখন সেই পরিবর্তনশীলটি আপডেট করতে হয়। পদ্ধতির শেষ যুক্তিটি transitionCompleted:আপনাকে বলতে পারে যে কোনও ব্যবহারকারী কোনও পৃষ্ঠার পরিবর্তনটি সম্পন্ন করেছে কিনা।

তারপরে, আপনি বর্তমানে উপস্থাপিত ভিউ কন্ট্রোলারটি করে তা পেতে পারেন

self.viewControllers?.first

4
সঠিক উত্তরের জন্য +1 - আমি আশা করি আমি কেবল ইউআইপেজভিউ কনট্রোলারের সাথে কাজ করার এবং আইওএস 5 সমর্থন করি।
পর্যন্ত

ধন্যবাদ, এটি হ'ল পরিষ্কার সমাধানটি আমি সন্ধান করছিলাম। পৃষ্ঠাগুলিতে প্রতিনিধিদের চেয়ে ভাল।
জানুয়ারী

4
আপনি যখন ডিভাইসটি ঘোরান, আপনি কীভাবে বর্তমান পৃষ্ঠার ট্র্যাক রাখবেন?
সত্যম

@ আপনি এখনও করতে পারেন, কেবলমাত্র আপনার প্রকল্পের নূতন সংস্করণটি আইওএস 5.0
এমটিমুরডক

84
আপনি কীভাবে বলতে পারবেন যে বর্তমান পৃষ্ঠা নম্বর বাড়ানো বা হ্রাস করতে হবে?
শিম করুন

59

আইওএস 6 হিসাবে আমি খুঁজে পেয়েছি যে viewControllersইউআইপেজভিউ কনট্রোলারের সম্পত্তি ক্রমাগত আপডেট হয় যাতে এটি সর্বদা বর্তমান পৃষ্ঠার প্রতিনিধিত্ব করে এমন একটি ভিউ নিয়ন্ত্রককে ধরে রাখবে, এবং অন্য কিছুই নয়। সুতরাং, আপনি কল করে বর্তমান পৃষ্ঠা অ্যাক্সেস করতে পারেনviewControllers[0] (ধরে নিলে আপনি একসাথে কেবলমাত্র একটি ভিউ নিয়ন্ত্রক দেখান)।

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

আপনি যদি "পৃষ্ঠা নম্বরগুলি" ট্র্যাক রাখতে চান তবে আপনি ইউআইপেজভিউকন্ট্রোলার ডেটাসোর্স পদ্ধতিগুলির মাধ্যমে আপনার ভিউ কন্ট্রোলারগুলিকে একটি সূচক মান নির্ধারণ করুন।


উদাহরণস্বরূপ:

-(void)autoAdvance
    {
    UIViewController *currentVC = self.viewControllers[0];
    NSUInteger currentIndex = [myViewControllers indexOfObject:currentVC];

    if ( currentIndex >= (myViewControllers.count-1) ) return;

    [self setViewControllers:@[myViewControllers[ currentIndex+1 ]]
        direction:UIPageViewControllerNavigationDirectionForward
        animated:YES
        completion:nil];
    }
-(NSInteger)presentationIndexForPageViewController:
                         (UIPageViewController *)pageViewController
    {
    // return 0;
    UIViewController *currentVC = self.viewControllers[0];
    NSUInteger currentIndex = [myViewControllers indexOfObject:currentVC];
    return currentIndex;
    }

তবে মন্তব্যগুলি নোট করুন যে এটি বিশ্বাসযোগ্য নয়।


4
আমি এটি অবিশ্বাস্য বলে মনে করেছি। আমি সমস্যার উত্স খুঁজে পাইনি। অ্যানিমেশনটি শেষ হয়ে গেলে আমি viewControllersসম্পত্তি অ্যাক্সেস করি এবং আমি সঠিক দর্শনীয় নিয়ামকগুলি পাই তবে আমি যখন পদ্ধতিতে ঘোরান তখন আমি spineLocationForInterfaceOrientationআর সঠিক ভিউ নিয়ন্ত্রণকারী পাই না। তাই আমি সর্বদা এর উপর নির্ভর করার পরিবর্তে আমার নিজের বর্তমান পৃষ্ঠা সম্পত্তিটি বজায় রাখতে দৃic়তাবদ্ধ viewControllers
ফেবিও অলিভিরা

আকর্ষণীয়, আমি এই বিশেষ ক্ষেত্রে এটি কেমন আচরণ করে তা দেখতে এটির সাথে কিছুটা খেলব
এডি বোরজা

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

4
@ জ্যাকমরিস এটি একেবারে অবিশ্বাস্য, আপনি বেশ সঠিক। এটি একটি "অ্যাপল হরর মুহূর্ত"। ওহ কেন তারা ডান দিকে সরানোর মতো স্পষ্ট ফাংশনগুলিকে অন্তর্ভুক্ত করবে না, আমি বর্তমানে কোন পৃষ্ঠায় আছি ইত্যাদি ইত্যাদি। এটি এতটা অবিশ্বাস্য যে আপনি "আপনার পৃষ্ঠাটি পেতে পারেন না !!!"
ফ্যাটি

4
self.viewControllers [0] আমার জন্য ভাল কাজ করে বলে মনে হচ্ছে। তবে আমি একবার দীক্ষা চলাকালীন একবার সেটভিউকন্ট্রোলারকে কল করেছি এবং বাকীটি অটোমেশনে রেখেছি। (আইওএস 8.4 এ পরীক্ষিত)
বব

45

দুর্ভাগ্যক্রমে, উপরের সমস্ত পদ্ধতিগুলি আমাকে সাহায্য করে নি। তবুও, আমি ট্যাগ ব্যবহার করে সমাধানটি খুঁজে পেয়েছি। এটি সেরা নাও হতে পারে তবে এটি কাজ করে এবং আশা করে যে এটি কাউকে সহায়তা করবে:

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed 
{
    if (completed) {
        int currentIndex = ((UIViewController *)self.pageViewController.viewControllers.firstObject).view.tag;
        self.pageControl.currentPage = currentIndex;
    }
}

সুইফটে : ( @ জেসিকে ধন্যবাদ )

func pageViewController(pageViewController: UIPageViewController,
    didFinishAnimating finished: Bool,
    previousViewControllers: [UIViewController],
    transitionCompleted completed: Bool)
{
    guard completed else { return }
    self.pageControl.currentPage = pageViewController.viewControllers!.first!.view.tag
}

উদাহরণ: গিস্ট


4
এটি আমার পক্ষে সবচেয়ে সোজাসাপ্টা এবং ভাল কাজ করেছে বলে মনে হয়। আমি ভিউ কন্ট্রোলারগুলি যুক্ত করার জন্য ট্যাগগুলি সেট করেছি (উদাহরণস্বরূপ, হেল্পপেজ 1ভিউ কনট্রোলার * পৃষ্ঠা 1 = [সেল্ফ স্টোরবোর্ড ইনস্ট্যানিয়েটভিউ কনট্রোলার উইথআইডিটিফায়ার: @ "পৃষ্ঠা 1"]; পৃষ্ঠা 1.ভিউ.ট্যাগ = 0;); তারপরে আপনি যেখানে রয়েছেন তার উপর নজর রাখতে আপনি মাস্টার ভিউ কন্ট্রোলারের জন্য একটি বর্তমান পৃষ্ঠা সম্পত্তি সেট করতে পারেন। কেবলমাত্র ডেটা উত্স নয়, উভয় প্রোটোকল ("<ইউআইপেজভিউ কনট্রোলারডেটসোর্স, ইউআইপিএজভিউ কনট্রোলারডেলিগেট>") যোগ করার বিষয়ে নিশ্চিত হন এবং প্রতিনিধিটিকে স্ব ("সেলফ.পেজভিউকন্ট্রোলারডেলগেট = স্ব;") সেট করুন বা পদ্ধতিটি কল করা হবে না। এটি আমাকে কিছুটা অবাক করে দিয়েছে।
জেমস টুমি

4
@ ভিক্টরএম এই সমাধানটি আমার পক্ষে কাজ করে না। আমার কাছে বিভিন্ন চিত্র সহ একটি পৃষ্ঠাভিউ নিয়ন্ত্রণকারী রয়েছে। এটি প্রতিটি সোয়াইপের জন্য ট্যাগ 0 ফেরত রাখে, কোনও ধারণা কেন এমন হয়? অগ্রিম ধন্যবাদ
২২

4
@ ভিক্টরএম আমি কয়েক দিন অতিবাহিত করে সূচকটি সংরক্ষণের চেষ্টা করেছি, তবে দুর্ঘটনাক্রমে এই উত্তরটি খুঁজে পেতে চাই, আমি আশা করি যে আমি 1000 বার উর্ধ্বতন করতে পারব, ধন্যবাদ!
এভেজেনি ক্লেবান

4
দুর্দান্ত সমাধান ধন্যবাদ এটিকে ঘুরে দেখার জন্য কয়েক ঘন্টা সময় ব্যয় করেছেন
ভিশন এমখাবেলা

এটি কেবলমাত্র 0 এর মান ফেরত দেয় আমি কিছু ভুল করছি
এন ডের

35

ওলে এর উত্তরে বিল্ডিং…

বর্তমান পৃষ্ঠাকে ট্র্যাক করতে এবং পৃষ্ঠা সূচকটিকে সঠিক সূচীতে আপডেট করার জন্য আমি 4 পদ্ধতি প্রয়োগ করেছি:

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController{

    return (NSInteger)[self.model count];

}

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController{

    return (NSInteger)self.currentIndex;
}

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

    SJJeanViewController* controller = [pendingViewControllers firstObject];
    self.nextIndex = [self indexOfViewController:controller];

}

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed{

    if(completed){

        self.currentIndex = self.nextIndex;

    }

    self.nextIndex = 0;

}

4
আমি মনে করি যে কোনও রূপান্তর সম্পন্ন না হলে সঠিকভাবে সূচকটি পুনরুদ্ধার করার self.nextIndex = self.currentIndexপরিবর্তে শেষ লাইনটি হওয়া উচিত self.nextIndex = 0। অন্যথায় আপনি currentIndexআপনার পৃষ্ঠাগুলির মাঝখানে কোথাও দ্রুত পেছনে পেজ করার সময় 0 টির মান দিয়ে শেষ হওয়ার ঝুঁকি ফেলেন।
20 মিনিটে হরলাইন্ড

4
এটি আমার পক্ষে পুরোপুরি কাজ করে না। কখনও কখনও, পৃষ্ঠাভিউ কনট্রোলার: উইল ট্রান্সনিশনটিওভিউ কনট্রোলারগুলি কল হয় না এবং তাই পরবর্তী ইনডেক্সটি পরিবর্তিত হয় না এবং বর্তমান সূচকটি তখন ভুল।
হেডেন হলিগান

31

নীচের সমাধানটি আমার পক্ষে কাজ করেছিল।

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

- (void)pageViewController:(UIPageViewController *)pvc didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
  if (!completed)
  {
    return;
  }
  NSUInteger currentIndex = [[self.pageViewController.viewControllers lastObject] index];
  self.pageControl.currentPage = currentIndex;
}

4
এই সূচক বলতে আপনার অর্থ কি?
যোহন

আমি সূচকটি পেয়ে যাচ্ছি (অর্থাত্, পূর্ণসংখ্যা যা সেল্ফ.পেজভিউকন্ট্রোলআরভিউ কনট্রোলারগুলির অ্যারেতে বর্তমান ভিউ কন্ট্রোলারের অবস্থানকে উপস্থাপন করে) এবং তারপরে স্ব.পেজকন্ট্রোলের বর্তমান পৃষ্ঠা বৈশিষ্ট্যটি সেট করতে এটি ব্যবহার করে (যা একটি পূর্ণসংখ্যার মান আশা করে) । ধারণা তৈরী কর?
sirvine

6
সূচকটি এখানে বিশ্বাসযোগ্য একটি কাস্টম সম্পত্তি
অ্যাডাম জনস

এর সাথে সমস্যা হ'ল আপনি যদি অ্যানিমেশন পদ্ধতি ছাড়াই পৃষ্ঠা পরিবর্তন করতে চান তবে কল করা হবে না
সিলভিউ সেন্ট

19

সুইফট 4

কোনও অপ্রয়োজনীয় কোড নেই। এটি করার 3 টি উপায়। ইউআইপেজভিউকন্ট্রোলারডেলিগেট পদ্ধতি ব্যবহার করে ।

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
    guard completed else { return }

    // using content viewcontroller's index
    guard let index = (pageViewController.viewControllers?.first as? ContentViewController)?.index else { return }

    // using viewcontroller's view tag
    guard let index = pageViewController.viewControllers?.first?.view.tag else { return }

    // switch on viewcontroller
    guard let vc = pageViewController.viewControllers?.first else { return }
    let index: Int
    switch vc {
    case is FirstViewController:
        index = 0
    case is SecondViewController:
        index = 1
    default:
        index = 2
    }
}

সৃষ্টিকর্তাকে ধন্যবাদ! আমি সম্পর্কে জানতাম না pageViewController.viewControllers। আপনি কীভাবে ভিউকন্ট্রোলারদের জানেন? প্রথম প্রশ্নটিতে প্রশ্নটি রয়েছে?
স্ক্রিপ্ট কিটি

খুব সহজ আসলে, ভিউকন্ট্রোলার অ্যারে কেবল উপস্থাপিত ভিউ কন্ট্রোলার ধারণ করে।
নিকোলা মিলিসেভিক

4
আমি কীভাবে সেই ফাংশনটির বাইরে সূচি ভেরিয়েবল অ্যাক্সেস করব?
এন ডের

11

আমি একটি ছোট ফাংশন ব্যবহার করে এবং পেজ ইনডেক্সকে স্ট্যাটিক এনএসআইন্টিজার হিসাবে নির্দিষ্ট করে পৃষ্ঠা সূচকটি ট্র্যাক করছি।

-(void) setPageIndex
{
    DataViewController *theCurrentViewController = [self.pageViewController.viewControllers objectAtIndex:0];

    pageIndex = [self.modelController indexOfViewController:theCurrentViewController];
}

এবং [self setPageIndex];ওলে দ্বারা নির্দিষ্ট ফাংশনটির ভিতরে এবং ওরিয়েন্টেশন পরিবর্তন সনাক্ত করার পরে কল করা।


5

আমি প্রথমে কোরির সমাধানটি ব্যবহার করেছি তবে এটি আইওএস 5 এ কাজ করছে না তারপরে ব্যবহার করে শেষ হয়েছে,

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed{

    if(completed) {
        _currentViewController = [pageViewController.viewControllers lastObject];
    }
}

এটি বিভিন্ন পৃষ্ঠাগুলিতে স্যুইচ করার চেষ্টা করেছে এবং এটি আপাতত ভাল কাজ করে।


3

দুর্ভাগ্যক্রমে উপরের কিছুই আমার পক্ষে কাজ করে না।

আমার দুটি ভিউ কন্ট্রোলার রয়েছে এবং আমি যখন সামান্য (20px প্রায়) সর্বশেষ ভিউটি পিছনের দিকে স্ক্রোল করি তবে এটি প্রতিনিধিটিকে ট্রিগার করে:

pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:

এবং বলছে যে বর্তমান পৃষ্ঠা (সূচক) 0যা ভুল is

শিশু প্রদর্শনের অভ্যন্তরে প্রতিনিধি ব্যবহার করা নিয়ন্ত্রণকারী যেমন:

- (void)ViewController:(id)VC didShowWithIndex:(long)page;

// and a property

@property (nonatomic) NSInteger index;

এটি ভিতরে ভিতরে ট্রিগার করা হয় viewDidAppear:

- (void)viewDidAppear:(BOOL)animated
{
    ...

    [self.delegate ViewController:self didShowWithIndex:self.index];
}

আমার জন্য কাজ করেছেন।


3

এটি নির্ভরযোগ্যভাবে আমার জন্য কাজ করে

আমার কাছে একটি কাস্টম ইউআইপেজকন্ট্রোলার রয়েছে। এই পৃষ্ঠাটি কনট্রোলার.কমের পেইজটি ভিউইলঅপায়ারে প্রদর্শিত ইউআইভিউউকন্ট্রোলার থেকে আপডেট করা হয়েছে

   var delegate: PageViewControllerUpdateCurrentPageNumberDelegate?

      init(delegate: PageViewControllerUpdateCurrentPageNumberDelegate ){
        self.delegate = delegate
        super.init(nibName: nil, bundle: nil)
      }

      required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
      }

    override func viewWillAppear(animated: Bool) {

        if delegate != nil {
          self.delegate!.upateCurrentPageNumber(0) //(0) is the pageNumber corresponding to the displayed controller
        }
      } 

    //In the pageViewController 

    protocol PageViewControllerUpdateCurrentPageNumberDelegate {

      func upateCurrentPageNumber(currentPageIndex: Int)
    }

     create the view display controllers initializing with the delegate

    orderedViewControllers = {
              return [
                IntroductionFirstPageViewController(delegate: self),
                IntroductionSecondPageViewController(delegate: self),
                IntroductionThirdPageViewController(delegate: self)
              ]

            }()

    the function implementing the protocol

    func upateCurrentPageNumber(currentPageIndex: Int){
        pageControl.currentPage = currentPageIndex
      }

1

আমি view.tagএখন কিছুক্ষণ ব্যবহার করছি, বর্তমান পৃষ্ঠার উপর নজর রাখার চেষ্টা করা খুব জটিল ছিল।

এই কোডটিতে সূচকটি tagপ্রতিটিটির সম্পত্তির মধ্যে সংরক্ষণ করা হয় viewএবং পরবর্তী বা পূর্ববর্তী ভিসি আনতে ব্যবহৃত হয়। এই পদ্ধতিটি ব্যবহার করে অসীম স্ক্রোল তৈরি করাও সম্ভব। এই সমাধানটি দেখতে কোডটিতে মন্তব্যটি দেখুন:

extension MyPageViewController: UIPageViewControllerDataSource {

  func viewControllerWithIndex(var index: Int) -> UIViewController! {
    let myViewController = storyboard?.instantiateViewControllerWithIdentifier("MyViewController") as MyViewController

    if let endIndex = records?.endIndex {
      if index < 0 || index >= endIndex { return nil }
      // Instead, We can normalize the index to be cyclical to create infinite scrolling
      // if index < 0 { index += endIndex }
      // index %= endIndex
    }

    myViewController.view.tag = index
    myViewController.record = records?[index]

    return myViewController
  }

  func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
    let index = viewController.view?.tag ?? 0
    return viewControllerWithIndex(index + 1)
  }

  func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
    let index = viewController.view?.tag ?? 0
    return viewControllerWithIndex(index - 1)
  }

  func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
    return records?.count ?? 0
  }

  func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
    return (pageViewController.viewControllers.first as? UIViewController)?.view.tag ?? 0
  }
}

1

আপনার উত্তর ছেলের জন্য ধন্যবাদ, আমি অনুরূপ সমস্যার মুখোমুখি হয়েছি, সূচি সঞ্চয় করতে হয়েছিল। আমি আমার কোডটি সামান্য পরিবর্তন করেছি, নীচে এটি পেস্ট করুন:

- (MenuListViewController *)viewControllerAtIndex:(NSInteger)index {

    if (_menues.count < 1)
        return nil;

    //    MenuListViewController *childViewController = [MenuListViewController initWithSecondSetFakeItems];
    MenuListViewController *childViewController = self.menues[index];
    childViewController.index = index;

    return childViewController;
}

#pragma mark - Page View Controller Data Source

- (void)pageViewController:(UIPageViewController *)pageViewController
        didFinishAnimating:(BOOL)finished
   previousViewControllers:(NSArray<UIViewController *> *)previousViewControllers
       transitionCompleted:(BOOL)completed{

    if (completed) {

        NSUInteger currentIndex = ((MenuListViewController *)self.pageController.viewControllers.firstObject).index;
        NSLog(@"index %lu", (unsigned long)currentIndex);
    }
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    NSUInteger index = [(MenuListViewController *)viewController index];

    if (index == 0)
        return nil;

    index --;

    return [self viewControllerAtIndex:index];
}


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

    NSUInteger index = [(MenuListViewController *)viewController index];

    index ++;

    if (index == _menues.count)
        return nil;

    return [self viewControllerAtIndex:index];
}

0
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed {

    NSLog(@"Current Page = %@", pageViewController.viewControllers);

    UIViewController *currentView = [pageViewController.viewControllers objectAtIndex:0];

    if ([currentView isKindOfClass:[FirstPageViewController class]]) {
             NSLog(@"First View");
        }
        else if([currentView isKindOfClass:[SecondPageViewController class]]) {
             NSLog(@"Second View");
        }
        else if([currentView isKindOfClass:[ThirdViewController class]]) {
              NSLog(@"Third View");
        }
}

//pageViewController.viewControllers always return current visible View ViewController

0

ডেমো কোডের নীচে (সুইফ্ট 2 তে) যা দেখায় যে এটি কীভাবে একটি সাধারণ চিত্র স্বেপার টিউটোরিয়াল প্রয়োগ করে করা হয়। কোড নিজেই মন্তব্য:

import UIKit

/*
VCTutorialImagePage represents one page show inside the UIPageViewController.
You should create this page in your interfacebuilder file:
- create a new view controller
- set its class to VCTutorialImagePage
- sets its storyboard identifier to "VCTutorialImagePage" (needed for the loadView function)
- put an imageView on it and set the contraints (I guess to top/bottom/left/right all to zero from the superview)
- connect it to the "imageView" outlet
*/

class VCTutorialImagePage : UIViewController {
    //image to display, configure this in interface builder
    @IBOutlet weak var imageView: UIImageView!
    //index of this page
    var pageIndex : Int = 0

    //loads a new view via the storyboard identifier
    static func loadView(pageIndex : Int, image : UIImage) -> VCTutorialImagePage {
        let storyboard = UIStoryboard(name: storyBoardHome, bundle: nil)
        let vc = storyboard.instantiateViewControllerWithIdentifier("VCTutorialImagePage") as! VCTutorialImagePage
        vc.imageView.image      = image
        vc.pageIndex            = pageIndex
        return vc
    }
}


/*
VCTutorialImageSwiper takes an array of images (= its model) and displays a UIPageViewController 
where each page is a VCTutorialImagePage that displays an image. It lets you swipe throught the 
images and will do a round-robbin : when you swipe past the last image it will jump back to the 
first one (and the other way arround).

In this process, it keeps track of the current displayed page index
*/

class VCTutorialImageSwiper: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {

    //our model = images we are showing
    let tutorialImages : [UIImage] = [UIImage(named: "image1")!, UIImage(named: "image2")!,UIImage(named: "image3")!,UIImage(named: "image4")!]
    //page currently being viewed
    private var currentPageIndex : Int = 0 {
        didSet {
            currentPageIndex=cap(currentPageIndex)
        }
    }
    //next page index, temp var for keeping track of the current page
    private var nextPageIndex : Int = 0


    //Mark: - life cylce


    override func viewDidLoad() {
        super.viewDidLoad()
        //setup page vc
        dataSource=self
        delegate=self
        setViewControllers([pageForindex(0)!], direction: .Forward, animated: false, completion: nil)
    }


    //Mark: - helper functions

    func cap(pageIndex : Int) -> Int{
        if pageIndex > (tutorialImages.count - 1) {
            return 0
        }
        if pageIndex < 0 {
            return (tutorialImages.count - 1)
        }
        return pageIndex
    }

    func carrouselJump() {
        currentPageIndex++
        setViewControllers([self.pageForindex(currentPageIndex)!], direction: .Forward, animated: true, completion: nil)
    }

    func pageForindex(pageIndex : Int) -> UIViewController? {
        guard (pageIndex < tutorialImages.count) && (pageIndex>=0) else { return nil }
        return VCTutorialImagePage.loadView(pageIndex, image: tutorialImages[pageIndex])
    }

    func indexForPage(vc : UIViewController) -> Int {
        guard let vc = vc as? VCTutorialImagePage else {
            preconditionFailure("VCPagImageSlidesTutorial page is not a VCTutorialImagePage")
        }
        return vc.pageIndex
    }


    //Mark: - UIPageView delegate/datasource


    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
        return pageForindex(cap(indexForPage(viewController)+1))
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
        return pageForindex(cap(indexForPage(viewController)-1))
    }

    func pageViewController(pageViewController: UIPageViewController, willTransitionToViewControllers pendingViewControllers: [UIViewController]) {
        nextPageIndex = indexForPage(pendingViewControllers.first!)
    }

    func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
        if !finished { return }
        currentPageIndex = nextPageIndex
    }

    func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
        return tutorialImages.count
    }

    func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
        return currentPageIndex
    }

}

0

আমার কাছে একটি ভিউকন্ট্রোলার অ্যারে রয়েছে, যা আমি ইউআইপেজভিউকন্ট্রোলারটিতে প্রদর্শন করি ।

extension MyViewController: UIPageViewControllerDataSource {

func presentationCount(for pageViewController: UIPageViewController) -> Int {
    return self.viewControllers.count
}

func presentationIndex(for pageViewController: UIPageViewController) -> Int {
    return self.currentPageIndex
}
}




extension MyViewController: UIPageViewControllerDelegate {

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {

    if !completed { return }

    guard let viewController = previousViewControllers.last, let index = indexOf(viewController: viewController) else {
        return
    }

    self.currentPageIndex = index

}

fileprivate func indexOf(viewController: UIViewController) -> Int? {
    let index = self.viewControllers.index(of: viewController)
    return index
}
}

নোট এখানে গুরুত্বপূর্ণ বিষয় যে setViewControllers পদ্ধতি UIPageViewController কোনো প্রতিনিধি কলব্যাক দেয় না। প্রতিনিধি কলব্যাকগুলি কেবল ইউআইপেজভিউকন্ট্রোলারের ব্যবহারকারী স্পর্শ ক্রিয়াকে উপস্থাপন করে


0

এই সমাধানটি আমি নিয়ে এসেছি:

class DefaultUIPageViewControllerDelegate: NSObject, UIPageViewControllerDelegate {

    // MARK: Public values
    var didTransitionToViewControllerCallback: ((UIViewController) -> Void)?

    // MARK: Private values
    private var viewControllerToTransitionTo: UIViewController!

    // MARK: Methods
    func pageViewController(
        _ pageViewController: UIPageViewController,
        willTransitionTo pendingViewControllers: [UIViewController]
    ) {
        viewControllerToTransitionTo = pendingViewControllers.last!
    }

    func pageViewController(
        _ pageViewController: UIPageViewController,
        didFinishAnimating finished: Bool,
        previousViewControllers: [UIViewController],
        transitionCompleted completed: Bool
    ) {
        didTransitionToViewControllerCallback?(viewControllerToTransitionTo)
    }
}

ব্যবহার:

 let pageViewController = UIPageViewController()
 let delegate = DefaultUIPageViewControllerDelegate()

 delegate.didTransitionToViewControllerCallback = {
    pageViewController.title = $0.title
 }

 pageViewController.title = viewControllers.first?.title
 pageViewController.delegate = delegate

প্রাথমিক শিরোনামটি নিশ্চিত করে নিন


0

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

func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
    if let index = self.allViewControllers.index(of: pendingViewControllers[0]) {
        self.pageControl.currentPage = index
    }
}

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
    if !completed, let previousIndex = self.allViewControllers.index(of: previousViewControllers[0]) {
        self.pageControl.currentPage = previousIndex
    }
}

0

(সুইফট 4 সংস্করণ) viewControllerথেকে সরাসরি জিজ্ঞাসা করার পদ্ধতি সম্পর্কে UIPageViewController:

fileprivate weak var currentlyPresentedVC: UIViewController?

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
    currentlyPresentedVC = pageViewController.viewControllers?.first
}

অথবা, যদি আপনার কেবলমাত্র কোনও সময়ে উপস্থিত উপস্থাপনা দেখার নিয়ামক প্রয়োজন হয়, কেবল pageViewController.viewControllers?.firstসেই সময়টি ব্যবহার করুন ।


0

দ্রুত 5 এবং নিম্নলিখিত sirvine উত্তর

extension InnerDetailViewController: UIPageViewControllerDelegate {

    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {

        if completed {
            guard let newIndex = embeddedViewControllers.firstIndex(where: { $0 == pageViewController.viewControllers?.last }) else { return }
            print(newIndex)
            currentEmbeddedViewControllerIndex = newIndex
        }

    }

} 

এক্ষেত্রে আমি ইউআইভিউউকন্ট্রোলার কোন শ্রেণিতে এম্বেড করা আছে তা আমি বিবেচনা করি না


-1
UIViewController *viewController = [pageViewController.viewControllers objectAtIndex:0];
NSUInteger currentIndex = [(ViewController*) viewController indexNumber];

এটি বর্তমান পৃষ্ঠা সূচক ফেরত দেবে। এবং অবশ্যই এই কোডটি ইউআইপিএজভিউ কনট্রোলারের (ডিফিনিশআনিমেটিং) প্রতিনিধি ফাংশনের অধীনে ব্যবহার করতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.