2016-08-15 6 views
2

Я хотел бы реализовать что-то вроде PageMenu. В настоящее время у меня есть контроллер корневого представления с двумя контейнерами внутри, с именем headerViewController и containerViewController. enter image description here Я все настроил, но я понятия не имею, как синхронизировать поведение между этими двумя контроллерами представлений.Как синхронизировать индекс между контроллерами вида

- Как я могу отправить свой индекс из UICollectionViewController в UIPageViewController?

- Как изменить индекс в UICollectionViewController при выполнении прокрутки UIPageViewController?

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 будет реализовывать протоколы containerViewControllerDelegate и headerViewControllerDelegate так что вы можете передать данные через эти делегаты.

Сообщите мне, если вам нужен пример.

+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

Если хотите, отметьте мой ответ как правильно, спасибо! –