2013-04-24 5 views
5

मैं UIPageViewController का उपयोग कर इंडेक्स का ट्रैक रखना चाहता हूं। जब भी मैं स्वाइप करता हूं मुझे index++ या index-- की आवश्यकता होती है। इस प्रतिनिधि विधि कहा जाता हो जाता है जब भी आप वापस या आगे की ओर स्वाइप करें:UIPageViewController चेक या अग्रेषित करते समय

- (void)pageViewController:(UIPageViewController *)pvc didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed 
{ 
    // If the page did not turn 
    if (!completed) 
    { 
     // You do nothing because whatever page you thought 
     // the book was on before the gesture started is still the correct page 
     return; 
    } 

    // I want to check here whenever the page was swiped back or further 
} 

मैं इस पद्धति में हमें कैसे पता चलेगा यदि उपयोगकर्ता वापस या आगे स्वाइप? मुझे पता है कि 2 डेटासोर्स विधियां हैं "viewControllerAfterViewController" और "viewControllerBeforeViewController" लेकिन मैं यह नहीं देख सकता कि पेज संक्रमण पूरा हो गया है या नहीं (और मैं इसे उपरोक्त विधि में कर सकता हूं) किसी भी विचार से मैं कैसे जान सकता हूं कि उपयोगकर्ता वापस या आगे में स्वाइप करता है या नहीं उपर्युक्त विधि?

उत्तर

3

documentation के अनुसार, यह बताने का कोई तरीका नहीं है कि उपयोगकर्ता ने पृष्ठ को आगे या पीछे स्वाइप किया है या नहीं। बुलियन 'समाप्त' आपको बताएगा कि उपयोगकर्ता ने पेज टर्न पूरा कर लिया है या नहीं।

का संभावित हल:

किसी पूर्णांक चर और viewControllerAfterViewController और viewControllerBeforeViewController तरीकों या तो वृद्धि या चर के मूल्य में कमी का उपयोग कर बनाएँ। यह जांचने के लिए कि वे आगे या पीछे चले गए हैं या नहीं।

संपादित करें: आप documentation

संपादित 2 से presentationIndexForPageViewController इस्तेमाल कर सकते हैं: इस लिंक here की जाँच करें वहाँ एक विधि setViewControllers:direction:animated:completion: नामित दिशा या तो UIPageViewControllerNavigationDirectionForward या UIPageViewControllerNavigationDirectionReverse

संपादित 3 होगा: कोड - यह मानते हुए है आप जानते हैं कि कौन से व्यू कंट्रोलर को या तो आगे या पीछे जाकर बुलाया जाएगा:

अपने ऐप पर एक चर बनाएँ और एक सेटर विधि:

int indexVar; 

- (void)setIndex:(int)indexVar; 
फिर अपने दृश्य नियंत्रकों पर

(आगे या पीछे) या तो मूल्य में वृद्धि या मूल्य (viewDidLoad) में कमी:

उन पंक्तियों के साथ
(AppDelegate *)[[UIApplication sharedApplication] delegate] setIndex:<whatever>]; 

कुछ। यह आपके लक्ष्य को पूरा करने का एक सटीक तरीका नहीं होगा, लेकिन उम्मीद है कि यह आपको सही दिशा में ले जाएगा।

+0

समस्या यह है कि मैं उन 2 कार्यों में सूचकांक का ट्रैक नहीं रख सकता ... क्योंकि मैं यह नहीं देख सकता कि संक्रमण पूरा हो गया है, अगर यह पूरा नहीं हुआ है तो सूचकांक में वृद्धि करने की आवश्यकता नहीं है या कमी (यदि आप पृष्ठ को पकड़ते हैं लेकिन इसे अगले पृष्ठ पर नहीं बदलते हैं) – nonuma

+1

मैंने आपकी टिप्पणियों को दर्शाने के लिए अपना उत्तर संपादित कर दिया है। प्रेजेंटेशन इंडेक्स तब तक नीचे या नीचे नहीं बदलेगा जब तक कि उपयोगकर्ता आगे या पीछे नहीं चला जाता। – Jordan

+0

और मैं उस विधि का उपयोग कैसे करूं? क्या आप मुझे थोड़ा उदाहरण दे सकते हैं कि मैं कैसे सूचकांक ++ और अनुक्रमणिका -? – nonuma

4

उपयोग प्रोटोकॉल:

MyClass : UIViewController <UIPageViewControllerDataSource,UIPageViewControllerDelegate 

एक गुण की घोषणा:

@property(nonatomic) NSInteger currentIndex; 
@property(nonatomic) NSInteger nextIndex; 

और तरीकों में:

-(void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers{ 
    NewsTableViewController *controller = [pendingViewControllers firstObject]; 
    self.nextIndex = [self.arrViews indexOfObject:controller]; 
} 

-(void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed{ 
    if (completed) { 
     self.currentIndex = self.nextIndex; 
    } 
    self.nextIndex = 0; 
} 
वहाँ

आप वर्तमान पृष्ठ होगा। enter link description here

+0

'अगला इंडेक्स' बराबर 'currentIndex + 1' होना चाहिए। 'DidFinishAnimating' में, नया 'currentIndex == अगला इंडेक्स' देखें, यह बाएं स्वाइप है, अन्यथा सही है – huync

+0

इस तरह ठीक काम करता है! –

0

में कोरी फ्लॉइड के लिए धन्यवाद, मैंने व्यूविल्लर विधि में प्रोटोकॉल विधि के साथ, मेरे प्रत्येक व्यू कंट्रोलर कक्षाओं में प्रोटोकॉल बनाकर ऐसा किया। फिर जब भी मैं व्यू कंट्रोलर में से किसी एक को तत्काल करता हूं तो पेजव्यू कंट्रोलर में मैंने अपने प्रतिनिधि को पेज व्यू कंट्रोलर के रूप में सेट किया है। यह मेरा परियोजना में 3 ViewController (ध्यान दें कि मैं मेरे विचार नियंत्रकों में से प्रत्येक में ऐसा करने के बाद) है

@class ViewController3; 
@protocol ViewControllerPageNumber <NSObject> 

-(void)viewWillAppearMyPageNumber:(int)myPageNumber; 

@end 
@interface ViewController3 : UIViewController 
@property (nonatomic, weak) id <ViewControllerPageNumber> delegate; 
@end 

और viewWillAppear विधि में मीटर फ़ाइल

-(void)viewWillAppear:(BOOL)animated{ 
    [self.delegate viewWillAppearMyPageNumber:3];//The 3 will be different for each ViewController 
} 

अगला में, PageViewController.m में, जब भी मैं एक व्यू कंट्रोलर को चालू करता हूं, मैंने अपने प्रतिनिधि को स्वयं (या पेज व्यू कंट्रोलर) सेट करने के लिए सेट किया है। viewCons सिर्फ मेरे दृश्य नियंत्रक नामों के साथ तारों की एक सरणी है।

- (UIViewController *)viewControllerAtIndex:(NSUInteger)index { 
    id vc = [[NSClassFromString([viewCons objectAtIndex:index]) alloc] init]; 
    if([vc isMemberOfClass:[NSClassFromString(@"ViewController3") class]]){ 
     ViewController3 *vc3=(ViewController3 *) vc; 
     vc3.delegate=self; 
    }else if([vc isMemberOfClass:[NSClassFromString(@"ViewController2") class]]){ 
     ViewController2 *vc2=(ViewController2 *) vc; 
     vc2.delegate=self; 
    }else if([vc isMemberOfClass:[NSClassFromString(@"ViewController") class]]){ 
     ViewController *vc1=(ViewController *) vc; 
     vc1.delegate=self; 
    } 
    return vc; 
} 

अंत में, मैं अपने कस्टम प्रतिनिधि विधि है, जो मेरे मामले में ताज़ा लेबल 'पाठ मैं PageViewController के शीर्ष पर स्थापित किया है है को लागू करने कर रहा हूँ।

-(void)viewWillAppearMyPageNumber:(int)myPageNumber{ 
    [self refreshLabelsOnCurrentPageWithIndex:myPageNumber]; 
} 
0

मुझे लगता है कि सबसे आसान समाधान एक संपत्ति है कि वर्तमान में दिखाया सूचकांक का ट्रैक रखता है के साथ एक स्वयं ViewController वर्ग बनाने के लिए है। ज्यादातर मामलों में मुझे अपने पेज व्यू कंट्रोलर के लिए किसी भी कस्टम व्यू कंट्रोलर की आवश्यकता है। मेरे उदाहरण में यह निम्नलिखित वर्ग है।

@interface PageZoomViewController : UIViewController 

@property (nonatomic) int pageIndex; 

@end 

फिर दृश्य में नियंत्रक के बाद/विधियों से पहले आप इंडेक्स को नए पृष्ठ पर पास कर सकते हैं।

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

    int nextPageIndex = ((PageZoomViewController *)viewController).pageIndex-1; 

    PageZoomViewController *controller = [[PageZoomViewController alloc] initWithPageViewControlParent:self andFrame:[self frameForPagingScrollView] andPageIndex:nextPageIndex]; 

    return controller; 
} 

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

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

    if(completed) { 
     index = ((PageZoomViewController *)thePageViewController.viewControllers[0]).pageIndex; 
    } 
} 

आशा है कि इससे मदद मिलती है!

संबंधित मुद्दे