Created
December 17, 2015 23:50
-
-
Save benjaminsnorris/baead59280f126175035 to your computer and use it in GitHub Desktop.
Page View Controller with Custom Tab Bar
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// ListViewController.swift | |
// welbe | |
// | |
// Created by Ben Norris on 12/3/15. | |
// Copyright © 2015 O.C. Tanner Corporation. All rights reserved. | |
// | |
import UIKit | |
class ListViewController: UITableViewController { | |
enum ListType: Int { | |
case Upcoming | |
case Declined | |
case Completed | |
static var count: Int { | |
if _count > 0 { return _count } | |
while let _ = ListType(rawValue: ++_count) {} | |
return _count | |
} | |
private static var _count = 0 | |
} | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// RootViewController.swift | |
// welbe | |
// | |
// Created by Ben Norris on 12/8/15. | |
// Copyright © 2015 O.C. Tanner Corporation. All rights reserved. | |
// | |
import UIKit | |
class RootViewController: UIViewController, SegueHandlerType { | |
enum SegueIdentifier: String { | |
case EmbedPageViewController = "EmbedPageViewController" | |
} | |
private var pageViewController: UIPageViewController? | |
@IBOutlet weak var customTabBar: CustomTabBar! | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
// Do any additional setup after loading the view. | |
let board = UIStoryboard(name: "Storyboard", bundle: nil) | |
guard let list = board.instantiateViewControllerWithIdentifier(ListViewController.storyboardIdentifier) as? ListViewController else { fatalError("Expected to get ListViewController") } | |
guard let pageViewController = pageViewController else { fatalError("Should have page view controller") } | |
pageViewController.setViewControllers([list], direction: .Forward, animated: false, completion: nil) | |
customTabBar.titles = ["Upcoming", "Declined", "Completed"] | |
customTabBar.delegate = self | |
} | |
// MARK: - Navigation | |
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { | |
switch segueIdentifierForSegue(segue) { | |
case .EmbedPageViewController: | |
guard let pageViewController = segue.destinationViewController as? UIPageViewController else { fatalError("Expected to get Page View Controller") } | |
pageViewController.dataSource = self | |
pageViewController.delegate = self | |
self.pageViewController = pageViewController | |
} | |
} | |
} | |
// MARK: - Page view controller data source | |
extension RootViewController: UIPageViewControllerDataSource { | |
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { | |
guard let currentList = viewController as? ListViewController else { fatalError("Must have a list for page view controller functionality") } | |
if currentList.listType.rawValue > 0 { | |
let previousIndex = currentList.listType.rawValue - 1 | |
return navigationTarget(previousIndex) | |
} else { | |
return nil | |
} | |
} | |
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { | |
guard let currentList = viewController as? ListViewController else { fatalError("Must have a list for page view controller functionality") } | |
if currentList.listType.rawValue < ListViewController.ListType.count - 1 { | |
let endIndex = currentList.listType.rawValue + 1 | |
return navigationTarget(endIndex) | |
} else { | |
return nil | |
} | |
} | |
} | |
// MARK: - Page view controller delegate | |
extension RootViewController: UIPageViewControllerDelegate { | |
func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { | |
guard let list = pageViewController.viewControllers?.first as? ListViewController else { fatalError("Expected a list") } | |
customTabBar.selectedIndex = list.listType.rawValue | |
} | |
} | |
// MARK: - Custom tab bar delegate | |
extension RootViewController: CustomTabBarDelegate { | |
func tabBar(tabBar: CustomTabBar, didSelectTab tab: Int) { | |
guard let pageViewController = pageViewController, currentViewController = pageViewController.viewControllers?.first as? ListViewController else { fatalError("Must have pageViewController to scroll") } | |
guard let targetViewController = navigationTarget(tab) where targetViewController != currentViewController else { return } | |
let forward = currentViewController.listType.rawValue < tab | |
pageViewController.setViewControllers([targetViewController], direction: forward ? .Forward : .Reverse, animated: true, completion: nil) | |
} | |
} | |
// MARK: - Private methods | |
private extension RootViewController { | |
func navigationTarget(index: Int) -> UIViewController? { | |
let board = UIStoryboard(name: "Storyboard", bundle: nil) | |
if let newListType = ListViewController.ListType(rawValue: index), newList = board.instantiateViewControllerWithIdentifier(ListViewController.storyboardIdentifier) as? ListViewController { | |
newList.listType = newListType | |
return newList | |
} | |
return nil | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment