2016-08-15 41 views
2

我想實現類似PageMenu的東西。目前,我有一個內部有2個容器的根視圖控制器,名爲headerViewControllercontainerViewControllerenter image description here 我已經設置了一切,但我不知道如何同步這兩個視圖控制器之間的行爲。如何在視圖控制器之間同步索引

- 如何將我的索引從UICollectionViewController發送到UIPageViewController?

- 當UIPageViewController做滾動時,如何更改UICollectionViewController中的索引?

RootViewController的

var headerViewController: PageMenuViewController? 
var containerViewController: PageViewController? 

override func awakeFromNib() { 
    pages = [Pages(name: "Page1", selected: true, url: photo1), Pages(name: "Page2", url: video1)] 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

// MARK: Navigation 
override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "rootViewSegue" { 
     containerViewController = segue.destination as? PageViewController 
     containerViewController!.controllerArray = pages 
    } else if segue.identifier == "headerViewSegue" { 
     headerViewController = segue.destination as? PageMenuViewController 
     headerViewController!.dataArray = pages 
    } 
} 

containerViewController(UIPageViewController)

func jumpToPage(_ index: Int) { 
    if index < orderedViewControllers.count { 
     setViewControllers([orderedViewControllers[index]], direction: .forward, animated: true, completion: nil) 
    } 
} 

headerViewController(UICollectionViewController)

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    // Sync index with containerViewController 
    // How to use jumpToPage ?? 
} 

enter image description here

回答

1

您可以使用委託模式,rootViewController將實現協議containerViewControllerDelegateheaderViewControllerDelegate這樣你就可以通過這些代表傳遞數據。

讓我知道你是否需要一個例子。

+0

是一個例子將是一件好事對於其他可能需要此解決方案的人 –

0

根據@ SaintThread的回答。 protocol/delegate適合我。

RootViewController的

class ViewController: UIViewController, PageMenuDelegate, PageViewDelegate { 

// MARK: Data Source 
let photo1 = Bundle.main.url(forResource: "pageView", withExtension: ".png")! 
let video1 = Bundle.main.url(forResource: "ElephantSeals", withExtension: ".mov")! 
var pages = [Pages]() 

var headerViewController: PageMenuViewController? 
var containerViewController: PageViewController? 

var currentIndex = 0 

override func awakeFromNib() { 
    pages = [Pages(name: "Page1", selected: true, url: photo1), Pages(name: "Page2", url: video1)] 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    headerViewController?.delegate = self 
    containerViewController?.containerDelegate = self 
} 

// MARK: Navigation 
override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "rootViewSegue" { 
     containerViewController = segue.destination as? PageViewController 
     containerViewController!.controllerArray = pages 
    } else if segue.identifier == "headerViewSegue" { 
     headerViewController = segue.destination as? PageMenuViewController 
     headerViewController!.dataArray = pages 
    } 
} 

// Delegate in CollectionViewController 
func selectItem(at index: Int) { 
    containerViewController?.pageIndex = index 
    currentIndex = index 
} 

// Delegate in UIPageViewController 
func scrollTo(_ index: Int) { 
    headerViewController?.setSelectedItem(at: IndexPath(row: index, section: 0)) 
    currentIndex = index 
} 

} 

CollectionViewController

protocol PageMenuDelegate { 
    func selectItem(at index: Int) 
} 

class PageMenuViewController: UIViewController { 
    var delegate: PageMenuDelegate? 
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
     setSelectedItem(at: indexPath) 
     delegate?.selectItem(at: indexPath.row) // HERE 
    } 

    func setSelectedItem(at indexPath: IndexPath) { 
     for i in 0..<dataArray.count { 
      dataArray[i].selected = false 
     } 
     dataArray[indexPath.row].selected = true 
     collectionView.reloadData() 
    } 
} 

PageViewController

protocol PageViewDelegate { 
    func scrollTo(_ index: Int) 
} 

class PageViewController: UIPageViewController { 
    var containerDelegate: PageViewDelegate? // "delegate" collides with pageview delegate 

    var pageIndex: Int = 0 { 
     didSet { 
      jumpToPage(pageIndex) 
      containerDelegate?.scrollTo(pageIndex) //HERE 
     } 
    } 

    func jumpToPage(_ index: Int) { 
     if index < orderedViewControllers.count { 
      setViewControllers([orderedViewControllers[index]], direction: .forward, animated: true, completion: nil) 
     } 
    } 
} 

extension PageViewController: UIPageViewControllerDataSource, UIPageViewControllerDelegate { 
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 
     ... pageIndex = index //HERE 
    } 
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 
     ... pageIndex = index //HERE 

    } 
} 
+0

如果需要,請將我的答案標爲正確,謝謝! –