2015-05-27 7 views
8

मेरे पास एक यूआईपीएज व्यू कंट्रोलर है, जो पेजों को चालू करने के लिए बाएं या दाएं स्वाइप करते समय ठीक काम करता है।आईओएस स्विफ्ट: यूआईपीएज व्यू कंट्रोलर - पेज को प्रोग्रामिक रूप से बदलना

class ViewController: UIViewController, UIPageViewControllerDataSource { 
... 
} 

अब मैं पृष्ठ पर पिछला/अगला बटन भी प्रदान करना चाहता हूं, ताकि पृष्ठों को इन बटनों पर क्लिक करके चालू किया जा सके।

मैं स्वाइप बाएं/दाएं व्यवहार को कैसे ट्रिगर कर सकता हूं या पृष्ठों को प्रोग्रामिक रूप से चालू कर सकता हूं?

नोट यह स्विफ्ट भाषा के लिए एक प्रश्न है, उद्देश्य-सी नहीं।

+0

की [? यह UIPageViewController में प्रोग्राम के रूप में बारी करने के लिए संभव पेज है] संभव डुप्लिकेट (http://stackoverflow.com/questions/7208871/is -it-possible-to-turn-page-programmatically-in-uipageviewcontroller) –

उत्तर

5

इस मज़े का उपयोग करें और अपनी इच्छित एनीमेशन के लिए संक्रमण शैली सेट करें।

private func slideToPage(index: Int, completion: (() -> Void)?) { 
    let count = //Function to get number of viewControllers 
    if index < count { 
     if index > currentPageIndex { 
      if let vc = viewControllerAtIndex(index) { 
       self.pageViewController.setViewControllers([vc], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: { (complete) -> Void in 
        self.currentPageIndex = index 
        completion?() 
       }) 
      } 
     } else if index < currentPageIndex { 
      if let vc = viewControllerAtIndex(index) { 
       self.pageViewController.setViewControllers([vc], direction: UIPageViewControllerNavigationDirection.Reverse, animated: true, completion: { (complete) -> Void in 
        self.currentPageIndex = index 
        completion?() 
       }) 
      } 
     } 
    } 
} 

viewControllerAtIndex(index: Int) -> UIViewController? लिए स्वाइप करने की सही दृश्य नियंत्रक प्राप्त करने के लिए अपने खुद के समारोह है:

enter image description here

enter image description here

+1

जॉर्डनसी> मुझे पृष्ठ को क्लिक करने के लिए पृष्ठ को चालू करने की आवश्यकता है - तो मैं उपरोक्त फ़ंक्शन का उपयोग कैसे करूं? – Jasper

+0

@ जैस्पर एक UIButton बनाएं और जब इसे क्लिक किया जाए, तो आप यह पता लगाएंगे कि कौन सा पृष्ठ आपके UIPageViewController में अगला है और उस पृष्ठ को setViewControllers विधि में पास करें। – JordanC

2

यहाँ इस बात का एक तेज कार्यान्वयन है।

30

आमतौर पर पेज इंडेक्स के साथ परेशान करने की आवश्यकता नहीं है और क्या नहीं। संभावना है कि आप पहले से ही dataSource: UIPageViewControllerDataSource लागू कर रहे हैं, जिसमें आपको पिछले या अगले व्यू कंट्रोलर को प्रदर्शित करने के लिए आवश्यक सभी चीजें हैं।

स्विफ्ट 2.2 उदाहरण:

extension UIPageViewController { 

    func goToNextPage(){ 

     guard let currentViewController = self.viewControllers?.first else { return } 

     guard let nextViewController = dataSource?.pageViewController(self, viewControllerAfterViewController: currentViewController) else { return } 

     setViewControllers([nextViewController], direction: .Forward, animated: false, completion: nil) 

    } 


    func goToPreviousPage(){ 

     guard let currentViewController = self.viewControllers?.first else { return } 

     guard let previousViewController = dataSource?.pageViewController(self, viewControllerBeforeViewController: currentViewController) else { return } 

     setViewControllers([previousViewController], direction: .Reverse, animated: false, completion: nil) 

    } 

} 

इस तरह से आप की गारंटी कर रहे हैं कि आप जिन पन्नों को परिवर्तित कर रहे हैं वास्तव में कर रहे हैं क्या PageViewController के इशारों को ट्रिगर करेगा में बनाया गया।

+2

मुझे आपके विचार का उपयोग करके 'presentationIndexForPageViewController' को अपडेट करने का तरीका जानने का एक कठिन समय हो रहा है। मेरे 'पेज ItemViewController' पर, मुझे' itemIndex' नामक एक चर घोषित किया गया है। मैं इस विस्तार के भीतर कैसे सेट करूं? – Adrian

+0

मैंने टाइमर के साथ func goToNextPage() का उपयोग किया - तो मैं टाइमर के साथ अगले पृष्ठ पर स्क्रॉल करने के लिए इस विधि का उपयोग कैसे कर सकता हूं? यहां मेरे प्रश्न का लिंक https://stackoverflow.com/questions/45025088/change-pages-in-uipageviewcontroller-automatically-with-timer-in-swift-3?noredirect=1#comment77027842_45025088 –

+0

लाइफसेवर !!! बहुत बहुत धन्यवाद। मैं सिर्फ भविष्य के संदर्भ के लिए स्विफ्ट 3 संस्करण पोस्ट करने वाला हूं। – Gix

2

thatjuan के जवाब का स्विफ्ट 3 संस्करण (animated पैरामीटर के लिए एक छोटी सी ट्वीक साथ के रूप में मैं यह आवश्यक डिफ़ॉल्ट रूप से एनिमेटेड करने के लिए हो सकता है, लेकिन अभी भी समारोह में एक पैरामीटर लेने) मामले किसी में इसकी आवश्यकता है:

extension UIPageViewController { 

    func goToNextPage(animated: Bool = true) { 
     guard let currentViewController = self.viewControllers?.first else { return } 
     guard let nextViewController = dataSource?.pageViewController(self, viewControllerAfter: currentViewController) else { return } 
     setViewControllers([nextViewController], direction: .forward, animated: animated, completion: nil) 
    } 

    func goToPreviousPage(animated: Bool = true) { 
     guard let currentViewController = self.viewControllers?.first else { return } 
     guard let previousViewController = dataSource?.pageViewController(self, viewControllerBefore: currentViewController) else { return } 
     setViewControllers([previousViewController], direction: .reverse, animated: animated, completion: nil) 
    } 

} 
0

बस इसे यहां छोड़कर किसी भी व्यक्ति को परिभाषित प्रोटोकॉल का उपयोग आसपास के नेविगेट करने और प्रोग्राम नियंत्रकों को बदलने के लिए करना चाहता है।

@objc protocol AppWalkThroughDelegate { 
    @objc optional func goNextPage(forwardTo position: Int) 
    @objc optional func goPreviousPage(fowardTo position: Int) 
} 

उपर्युक्त प्रोटोकॉल का उपयोग करें और दृश्य नियंत्रकों के बीच नेविगेशन प्रबंधित करने के लिए रूट UIPageViewController की पुष्टि करें।

नीचे उदाहरण:

class AppWalkThroughViewController: UIPageViewController, UIPageViewControllerDataSource, AppWalkThroughDelegate { 

    // Add list of view controllers you want to load 

    var viewControllerList : [UIViewControllers] = { 
     let firstViewController = FirstViewController() 
     let secondViewController = SecondViewController() 
     // Assign root view controller as first responder 
     secondViewController.delegate = self 

     let thirdViewController = ThirdViewController() 

    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.dataSource = self 
    } 

    // Navigate to next page 
    func goNextPage(fowardTo position: Int) { 
     let viewController = self.viewControllerList[position] 
     setViewControllers([viewController], direction: 
     UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil) 
    } 

    } 

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

उदाहरण नीचे: प्रतिनिधि विधि लागू एक बार बटन दबाया

class SecondViewController: UIViewController { 

     var delegate: AppWalkThroughDelegate! 

     override func viewDidLoad() { 
      super.viewDidLoad() 
      self.dataSource = self 
     } 

     @IBAction func goNextPage(_ sender: Any) { 
      // Can be any number but not outside viewControllerList bounds 
      delegate.goNextPage!(fowardTo: 2) 
     } 
    } 
संबंधित मुद्दे