दिलचस्प पोस्ट
नम्पी जहां समारोह कई स्थितियों मैं model.save पर सफलता कॉलबैक कैसे ट्रिगर करूँ? पायथन में दूरी संपादित करें गतिविधि पट्टी एनीमेशन संक्रमण के दौरान एनिमेटिंग से मैं स्टेटस बार और नेविगेशन बार को कैसे रोकूं? अनुसूचित कार्य बनाना क्या आप एक बयान में MySQL में स्वत: वेतन वृद्धि मूल्य का उपयोग कर सकते हैं? बॉक्स छाया के साथ सीएसएस भाषण बबल हामकेस्ट संग्रह की तुलना करते हैं WPF / C #: मुझे उपयोगकर्ता प्राथमिकता फाइलों को कहाँ से बचा जाना चाहिए? Html टेबल के लिए डेटालेट जावा में कुछ सेकंड के इंतजार के लिए मैं सेलेनियम-वेबड्राइवर से कैसे पूछ सकता हूं? क्या सी + # में ++ i और i ++ के बीच कोई अंतर है? क्लोन () विधि java.lang.Object में क्यों सुरक्षित है? तीन। जेएस कैमरा ऊपर या नीचे झुकता है और क्षितिज का स्तर रखता है कोणीय में textarea मूल्य नहीं मिल सकता है

UIPageViewController, मैं डेटा स्रोत द्वारा निर्दिष्ट आदेश को बिना गड़बड़ किए एक विशिष्ट पृष्ठ पर कैसे सही ढंग से कूदूं?

मुझे कुछ प्रश्न मिल गए हैं कि कैसे एक विशिष्ट पृष्ठ पर UIPageViewController कूदना है, लेकिन मैंने कूदने में एक अतिरिक्त समस्या देखी है कि जवाब में से कोई भी स्वीकार नहीं करता है।

मेरे आईओएस एप के विवरण में जाने के बिना (जो कि एक पेज़ कैलेंडर के समान है), यहाँ यह है कि मैं क्या अनुभव कर रहा हूं। मैं एक UIPageViewController घोषित करता UIPageViewController , वर्तमान दृश्य नियंत्रक को सेट करता UIPageViewController , और डेटा स्रोत को लागू करता है।

 // end of the init method pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; pageViewController.dataSource = self; [self jumpToDay:0]; } //... - (void)jumpToDay:(NSInteger)day { UIViewController *controller = [self dequeuePreviousDayViewControllerWithDaysBack:day]; [pageViewController setViewControllers:@[controller] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { NSInteger days = ((THDayViewController *)viewController).daysAgo; return [self dequeuePreviousDayViewControllerWithDaysBack:days + 1]; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { NSInteger days = ((THDayViewController *)viewController).daysAgo; return [self dequeuePreviousDayViewControllerWithDaysBack:days - 1]; } - (UIViewController *)dequeuePreviousDayViewControllerWithDaysBack:(NSInteger)days { return [[THPreviousDayViewController alloc] initWithDaysAgo:days]; } 

नोट संपादित करें: मैंने dequeuing विधि के लिए सरलीकृत कोड जोड़ा। यहां तक ​​कि इस निन्दा कार्यान्वयन के साथ मुझे पेज ऑर्डर के साथ एक ही समस्या है।

प्रारंभिक रूप से अपेक्षित सभी काम करता है वृद्धिशील पेजिंग सभी ठीक काम करता है मुद्दा यह है कि अगर मैं कभी भी दोबारा jumpToDay वाला फोन करता jumpToDay , तो आदेश गड़बड़ हो जाता है।

यदि उपयोगकर्ता दिन -5 पर है और दिन 1 के लिए कूदता है, तो बायीं ओर एक स्क्रॉल दिन -5 को उचित दिन के बजाय फिर से प्रकट होगा। ऐसा कुछ ऐसा लगता है कि कैसे UIPageViewController पास के पन्नों का संदर्भ रखता है, लेकिन मैं किसी विधि का कोई संदर्भ नहीं मिल सकता है जो इसे कैश को ताज़ा करने के लिए बाध्य करेगा।

कोई विचार?

Solutions Collecting From Web of "UIPageViewController, मैं डेटा स्रोत द्वारा निर्दिष्ट आदेश को बिना गड़बड़ किए एक विशिष्ट पृष्ठ पर कैसे सही ढंग से कूदूं?"

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

 __weak UIPageViewController* pvcw = pvc; [pvc setViewControllers:@[page] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL finished) { UIPageViewController* pvcs = pvcw; if (!pvcs) return; dispatch_async(dispatch_get_main_queue(), ^{ [pvcs setViewControllers:@[page] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; }); }]; 

इसलिए मैं एक ऐसी समस्या में भाग गया जहां मुझे एक पृष्ठ पर 'कूद' करने में सक्षम होने की जरूरत थी और फिर जब मैंने एक पृष्ठ को वापस भेज दिया तो 'ऑर्डर गड़बड़' पाई। जहाँ तक मैं यह कहने में सक्षम हूं, पृष्ठ दृश्य नियंत्रक निश्चित रूप से दृश्य नियंत्रकों को कैश कर रहा है और जब आप एक पृष्ठ पर 'कूद' करते हैं तो दिशा निर्देशित करना है: आगे या पीछे यह तो मानता है कि नया दृश्य नियंत्रक पिछले व्यू नियंत्रक के लिए एक 'पड़ोसी' है और इसलिए जब आप वापस इशारा करते हैं तो स्वचालित रूप से पिछले दृश्य नियंत्रक को प्रस्तुत करता है। मैंने पाया कि यह तब होता है जब आप UIPageViewControllerTransitionStyleScroll का उपयोग कर रहे हैं और UIPageViewControllerTransitionStylePageCurl नहीं। पृष्ठ कर्ल शैली जाहिरा तौर पर उसी कैशिंग को नहीं करती है, क्योंकि यदि आप किसी पृष्ठ पर 'कूद' करते हैं और फिर इसे वापस pageViewController:viewController(Before/After)ViewController: तो यह pageViewController:viewController(Before/After)ViewController: देता है pageViewController:viewController(Before/After)ViewController: डेटा स्रोत को संदेश जो आपको सही पड़ोसी दृश्य प्रदान करने के लिए सक्षम करता है नियंत्रक।

समाधान: पृष्ठ पर एक 'कूद' करते समय आप पहले पृष्ठ पर पड़ोसी पृष्ठ पर जा सकते हैं ( animated:NO ) आप कूद रहे हैं और फिर उस छलांग के पूरा होने के बाद, वांछित पृष्ठ पर कूदें। यह कैश को अपडेट करेगा जैसे कि जब आप वापस इशारे करते हैं, तो सही पड़ोसी पृष्ठ प्रदर्शित होगा। नकारात्मक पक्ष यह है कि आपको दो दृश्य नियंत्रक बनाने की आवश्यकता होगी; जिस पर आप कूद रहे हैं और जिसको वापस लाने के बाद प्रदर्शित किया जाना चाहिए।

यहां एक श्रेणी के लिए कोड है जिसे मैंने UIPageViewController लिए लिखा था:

 @implementation UIPageViewController (Additions) - (void)setViewControllers:(NSArray *)viewControllers direction:(UIPageViewControllerNavigationDirection)direction invalidateCache:(BOOL)invalidateCache animated:(BOOL)animated completion:(void (^)(BOOL finished))completion { NSArray *vcs = viewControllers; __weak UIPageViewController *mySelf = self; if (invalidateCache && self.transitionStyle == UIPageViewControllerTransitionStyleScroll) { UIViewController *neighborViewController = (direction == UIPageViewControllerNavigationDirectionForward ? [self.dataSource pageViewController:self viewControllerBeforeViewController:viewControllers[0]] : [self.dataSource pageViewController:self viewControllerAfterViewController:viewControllers[0]]); [self setViewControllers:@[neighborViewController] direction:direction animated:NO completion:^(BOOL finished) { [mySelf setViewControllers:vcs direction:direction animated:animated completion:completion]; }]; } else { [mySelf setViewControllers:vcs direction:direction animated:animated completion:completion]; } } @end 

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

मैं इस फ़ंक्शन का उपयोग करता हूं (मैं हमेशा परिदृश्य, 2 पेज मोड में हूं)

 -(void) flipToPage:(NSString * )index { int x = [index intValue]; LeafletPageContentViewController *theCurrentViewController = [self.pageViewController.viewControllers objectAtIndex:0]; NSUInteger retreivedIndex = [self indexOfViewController:theCurrentViewController]; LeafletPageContentViewController *firstViewController = [self viewControllerAtIndex:x]; LeafletPageContentViewController *secondViewController = [self viewControllerAtIndex:x+1 ]; NSArray *viewControllers = nil; viewControllers = [NSArray arrayWithObjects:firstViewController, secondViewController, nil]; if (retreivedIndex < x){ [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL]; } else { if (retreivedIndex > x ){ [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:NULL]; } } } 

UIPageViewController उप वर्गों के लिए इस्तेमाल किया जाने वाला मेरा स्विफ्ट समाधान है:

आप viewControllerArray में viewControllerArray की एक सरणी और updateCurrentPageIndex में मौजूदा पृष्ठ अनुक्रमणिका की दुकान मान लें।

  private func slideToPage(index: Int, completion: (() -> Void)?) { let tempIndex = currentPageIndex if currentPageIndex < index { for var i = tempIndex+1; i <= index; i++ { self.setViewControllers([viewControllerArray[i]], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: {[weak self] (complete: Bool) -> Void in if (complete) { self?.updateCurrentPageIndex(i-1) completion?() } }) } } else if currentPageIndex > index { for var i = tempIndex - 1; i >= index; i-- { self.setViewControllers([viewControllerArray[i]], direction: UIPageViewControllerNavigationDirection.Reverse, animated: true, completion: {[weak self] (complete: Bool) -> Void in if complete { self?.updateCurrentPageIndex(i+1) completion?() } }) } } } 

मैं इस समस्या की पुष्टि कर सकता हूं, और यह केवल तब होता है जब UIPageViewControllerTransitionStyleScroll का उपयोग UIPageViewControllerTransitionStyleScroll और UIPageViewControllerTransitionStylePageCurl नहीं।

वैकल्पिक हल: एक पाश बनाओ और प्रत्येक पृष्ठ के लिए UIPageViewController setViewControllers को चालू करें, जब तक आप वांछित पृष्ठ तक नहीं पहुंच जाते।

यह सिंक में UIPageViewController में आंतरिक डेटाट्रेस इंडेक्स रखता है

डीजीबुउटी 33 के उत्तर का स्विफ्ट संस्करण:

 weak var pvcw = pageViewController pageViewController!.setViewControllers([page], direction: UIPageViewControllerNavigationDirection.Forward, animated: true) { _ in if let pvcs = pvcw { dispatch_async(dispatch_get_main_queue(), { pvcs.setViewControllers([page], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil) }) } } 

यह केवल समाधान है

 -(void)buyAction { isFromBuy = YES; APPChildViewController *initialViewController = [self viewControllerAtIndex:4]; viewControllers = [NSArray arrayWithObject:initialViewController]; [self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; } -(NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController { if (isFromBuy) { isFromBuy = NO; return 5; } return 0; } 

यह नोट करना महत्वपूर्ण है कि यह अब आईओएस 10 में मामला नहीं है और अब आपको स्वीकृत उत्तर समाधान का उपयोग नहीं करना है। बस हमेशा की तरह जारी रखें

मेरा एक अलग दृष्टिकोण था, संभव है कि यदि आपके पृष्ठों को इनट के बाद अद्यतन करने के लिए डिज़ाइन किया गया हो:
मैन्युअल पृष्ठ चुने जाने पर मैं एक झंडा अपडेट करता हूं I

 - (void)scrollToPage:(NSInteger)page animated:(BOOL)animated { if (page != self.currentPage) { [self setViewControllers:@[[self viewControllerForPage:page]] direction:(page > self.currentPage ? UIPageViewControllerNavigationDirectionForward : UIPageViewControllerNavigationDirectionReverse) animated:animated completion:nil]; self.currentPage = page; self.forceReloadNextPage = YES; // to override view controller automatic page cache } } - (ScheduleViewController *)viewControllerForPage:(NSInteger)page { CustomViewController * scheduleViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"CustomViewController"]; scheduleViewController.view.tag = page; // keep track of pages using view.tag property scheduleViewController.data = [self dataForPage:page]; if (self.currentViewController) scheduleViewController.calendarLayoutHourHeight = self.currentViewController.calendarLayoutHourHeight; return scheduleViewController; } 

और फिर सही डेटा से पुनः लोड करने के लिए अगले पृष्ठ पर बल दें:

 - (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers { CustomViewController * nextViewController = [pendingViewControllers lastObject]; // When manual scrolling occurs, the next page is loaded from UIPageViewController cache // and must be refreshed if (self.forceReloadNextPage) { // calculate the direction of the scroll to know if to load next or previous page NSUInteger page = self.currentPage + 1; if (self.currentPage > nextViewController.view.tag) page = self.currentPage - 1; nextViewController.data = [self dataForPage:page]; self.forceReloadNextPage = NO; } } 

यदि आपको नये पृष्ठ को सजीव करने की आवश्यकता नहीं है, जैसा कि मैंने नहीं किया है, तो निम्न कोड मेरे लिए काम किया है, जिसे स्टोरीबोर्ड में "वैल्यू चेंज्ड" कहा जाता है। दृश्य नियंत्रकों के बीच बदलने के बजाय, मैं वर्तमान दृश्य नियंत्रक से संबंधित डेटा को बदलता हूं।

  - (IBAction)pageControlCurrentPageDidChange:(id)sender { self.currentIndex = self.pageControl.currentPage; MYViewController *currentPageViewController = (MYViewController *)self.pageViewController.viewControllers.firstObject; currentPageViewController.pageData = [self.pageDataSource dataForPage:self.currentIndex]; [currentPageViewController updateDisplay]; } 

वर्तमान इंडेक्स वहाँ है, इसलिए मैं पेज को नियंत्रित कर सकता हूं, जब मैं पृष्ठों के बीच स्वाइप करता हूं

pageDataSource dataForPage: डेटा ऑब्जेक्ट की एक सरणी देता है जो पृष्ठों द्वारा प्रदर्शित होते हैं

मैं इस मुद्दे के साथ एक लंबे समय से खुद के लिए संघर्ष कर रहा था मेरे लिए मेरे पास स्टोरीबोर्ड से एक यूआईपीएज दृश्य नियंत्रक (मैं इसे पेज कंट्रोलर कहलाता है) लोड करता था और उस पर मैं एक यूआईवीआईयूआईयूटी्रोलर 'कंटेंटव्यू' जोड़ता था।

मैं ContentV को सामग्री क्षेत्र पर लोड होने वाले डेटा का ध्यान रखता हूं और पृष्ठकंट्रोलर स्लाइडिंग / गोटो / पेजइंडिकेटर अपडेट का ध्यान रखता हूं। ContentVC के पास एक ivar CurrentPageIndex है और वह पृष्ठ कंट्रोलर के लिए मान भेजता है, इसलिए PageController जानता है कि यह कौन सा पृष्ठ है मेरी। मी फ़ाइल में पेजकंट्रोलर है I में इन दो विधियां हैं I

ध्यान दें कि मैंने 0 पर सेट किया था और इसलिए हर बार पेजसी पुनः लोड करता है, यह पहले पेज पर जाता है जिसे मैं नहीं चाहता, [स्व दृश्य नियंत्रकअटइंडएक्स: 0]।

 - (void)setPageForward { ContentVC *FirstVC = [self viewControllerAtIndex:[CurrentPageIndex integerValue]]; NSArray *viewControllers = @[FirstVC]; [PageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; } 

यह दूसरा तरीका है PageViewController's DataSource विधि है presentationIndexForPageViewController हाइलाइट किए गए डॉट को सही पृष्ठ पर सेट कर देगा (आप चाहते हैं पृष्ठ)। ध्यान दें कि यदि हम 0 पर वापस लौटते हैं तो पेज इंडिकेटर पहले डॉट को उजागर करेगा जो पहले पेज को दर्शाता है और हम यह नहीं चाहते हैं।

 - (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController { return [CurrentPageIndex integerValue]; } 

यहां क्लीन अप-अप वाक्यविन्यास के साथ @ djibouti33 के उत्तर में एक अद्यतित स्विफ्ट 3+ संस्करण है

 weak var weakPageVc = pageVc pageVc.setViewControllers([page], direction: .forward, animated: true) { finished in guard let pageVc = weakPageVc else { return } DispatchQueue.main.async { pageVc.setViewControllers([page], direction: .forward, animated: false) } }