15

Ich möchte den aktuellen Index eines PageViewController bekommen, ich weiß nicht, wie ich den sichtbaren Seitenindex bekomme.PageViewController aktueller Seitenindex in Swift

func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool,previousViewControllers: [UIViewController],transitionCompleted completed: Bool) 
{ 
    // How to get it? 

} 
+0

siehe Link sein kann hilft Ihnen http://stackoverflow.com/questions/8400870/uipageviewcontroller-return-the-current-visible-view –

+0

Was die gelieferten Parameter, die Sie sagen? – Wain

Antwort

16

Sie können didFinishAnimating verwenden und Tags für Viewcontrollers festlegen. versuchen, diese

func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) 
{ 
    if (!completed) 
    { 
    return 
    } 
    self.pageControl.currentPageIndex = pageViewController.viewControllers!.first!.view.tag //Page Index 
} 
+5

aber 'pageViewController.viewControllers! .first! .view.tag' ist immer' 0', weil es immer zuerst ist :( –

+2

es muss einen besseren Weg geben, dies zu tun als mit Tags ... – adauguet

+0

Ja David Seek, könnten Sie verwenden der 'func pageViewController (_ pageViewController: UIPageViewController, didFinishAnimating abgeschlossen: Bool, previousViewControllers: [UIViewController], transitionCompleted abgeschlossen: Bool)' –

3

Try it ..

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

self.pageControl.currentPage = pageViewController.viewControllers!.first!.view.tag 
    } 
+0

ja set tag, ist die richtige Wahl dank – LeNI

+0

Fehler erhalten Wert vom Typ 'UIPageVieController' hat kein Mitglied ' currentPage ' –

6

Swift 3: volle programmatische PageViewController Beispiel zu bekommen/set die aktuelle Seite Index ohne Tagging:

enum PageViewType:String { 
     case green = "greenView" 
     case blue = "blueView" 
     case red = "redView" 
} 

class MyPageViewController: UIPageViewController { 

    private (set) lazy var orderedViewControllers:[UIViewController] = { 
     return [self.newPageView(.green), 
       self.newPageView(.blue), 
       self.newPageView(.red) 
     ] 
    } 

    var currentIndex:Int { 
      get { 
       return orderedViewControllers.index(of: self.viewControllers!.first!)! 
      } 

      set { 
       guard newValue >= 0, 
        newValue < orderedViewControllers.count else { 
        return 
       } 

       let vc = orderedViewControllers[newValue] 
       let direction:UIPageViewControllerNavigationDirection = newValue > currentIndex ? .forward : .reverse    
       self.setViewControllers([vc], direction: direction, animated: true, completion: nil) 
      } 
     } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     dataSource = self 

     if let firstViewController = orderedViewControllers.first { 
      setViewControllers([firstViewController], 
          direction: .forward, 
          animated: true, 
          completion: nil) 
     } 
    } 

    private func newPageView(_ viewType:PageViewType) -> UIViewController { 
     let vc = self.storyboard?.instantiateViewController(withIdentifier: viewType.rawValue)  
     return vc 
    } 
} 

UIPageViewController Datasource Implementierung:

extension MyPageViewController:UIPageViewControllerDataSource { 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 

     let previousIndex = currentIndex - 1 

     guard previousIndex >= 0 else { 
      return nil 
     } 

     guard orderedViewControllers.count > previousIndex else { 
      return nil 
     } 

     return orderedViewControllers[previousIndex] 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {   
     let nextIndex = currentIndex + 1 

     guard orderedViewControllers.count != nextIndex else { 
      return nil 
     } 

     guard orderedViewControllers.count > nextIndex else { 
      return nil 
     } 

     return orderedViewControllers[nextIndex] 
    } 

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

    func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { 

     return currentIndex 
    } 
} 
+1

Vielen Dank.Es funktioniert einwandfrei – Preetha

+0

wie currentIndex Funktion in viecontroller – rajesh

6

In Swift 3

Aufschalten didFinishAnimating Funktion UIPageViewControllerDelegate wie folgt aus:

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { 
    if completed { 
     if let currentViewController = pageViewController.viewControllers![0] as? WalkthroughContentViewController { 
      pageControl.currentPage = currentViewController.index 
     } 
    } 
} 

wo WalkthroughContentViewController die UIViewController von UIPageViewController

Denken Sie daran zu halten, eine Indexvariable innerhalb des WalkthroughContentViewController präsentiert wird. Auch im viewDidLoad Verfahren eingestellt:

delegate = self 
+0

aufrufen Thx, es funktioniert !! – HungCLo

0

Vergessen Sie nicht pageviewcontroller des Delegierten zu setzen.

func createPageViewController() { 
    // Create page view controller 
    pageViewController = storyboard?.instantiateViewController(withIdentifier: "PageViewController") as? UIPageViewController 
    pageViewController?.delegate = self 
    pageViewController?.dataSource = self 

    let startingViewController: ChildViewController = viewControllerAtIndex(index: 0)! 
    let viewControllers: Array = [startingViewController] 
    pageViewController?.setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil) 

    self.addChildViewController(pageViewController!) 
    self.view.frame = CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height) 
    self.view.addSubview((pageViewController?.view)!) 
    self.pageViewController?.didMove(toParentViewController: self) 
} 

func viewControllerAtIndex(index: Int) -> ChildViewController? { 
    // return nil here, if there won't be any page in pageviewcontroller 

    // Create a new view controller and pass suitable data. 
    let pageContentViewController: ChildViewController = storyboard?.instantiateViewController(withIdentifier: "ChildViewController") as! ChildViewController 

    pageContentViewController.pageIndex = index 
    return pageContentViewController 
} 

//Also add viewControllerAfter and viewControllerBefore methods 

func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) { 
    self.pendingIndex = (pendingViewControllers.first as! ChildViewController).pageIndex 
} 

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { 
    if completed { 
     self.currentIndex = self.pendingIndex! 
     //Perform your task here 
    } 
}