15

Я хочу получить текущий индекс страницыViewController, я не знаю, как получить индекс видимых страниц.PageViewController текущий индекс страницы в Swift

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

} 
+0

см ссылка может быть поможет вам http://stackoverflow.com/questions/8400870/uipageviewcontroller-return-the-current-visible-view –

+0

Что подаваемые параметры вам сказать? – Wain

ответ

16

Вы можете использовать didFinishAnimating и установить теги для просмотра контроллеров. попробуйте это

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

, но 'pageViewController.viewControllers! .first !.view.tag' всегда' 0', потому что он всегда первый :( –

+2

должен быть лучший способ сделать это, чем использовать теги ... – adauguet

+0

Да David Seek, вы можете использовать 'func pageViewController (_ pageViewController: UIPageViewController, didFinishAnimating закончен: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool)' –

3

Попробуй ..

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

yes set tag, является правильным выбором спасибо – LeNI

+0

Ошибка получения Значение типа 'UIPageVieController' не имеет членства ' currentPage ' –

6

Swift 3: полный пример программной PageViewController, чтобы получить/установить текущий индекс страницы без просмотра тегов:

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 осуществление:

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

Спасибо. Он отлично работает. – Preetha

+0

как вызвать функцию currentIndex в viecontroller – rajesh

6

В Swift 3

Override didFinishAnimating функция UIPageViewControllerDelegate как это:

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 
     } 
    } 
} 

где WalkthroughContentViewController является UIViewController представлены UIPageViewController

Помните индексной переменной внутри WalkthroughContentViewController. Кроме того, в методе viewDidLoad набора:

delegate = self 
+0

Thx, он работает !! – HungCLo

0

Не забудьте установить делегат pageviewcontroller в.

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 
    } 
} 
Смежные вопросы