UIPageViewControllerの1番簡潔なサンプル

UIPageViewControllerを使おうと思った時に、Page-Based-Applicationみたいなテンプレはよくわからないし、いろいろ見ても結局最低限何が欲しいんだ！っていうのがわかりにくかったのでメモ・・・
そして理解しきってないのでご指摘欲してます

## UIPageViewControllerってなんだ？

ずばり、UIViewControllerをいくつも同等な関係性で配置でき（tabbarみたいな感じ)、それをスワイプで遷移させられるもの
個人的に、TabBarControllerの、TabBarがない＆スワイプで遷移できる、ものと認識してます
あと、キュレーション系のアプリではコンテンツ部分でよく使われているらしい・・・

##最低限要るであろうもの
 
- HogeViewController
- PiyoViewController

それぞれコードは以下のような感じです。おそらく最低限です

```swift

import UIKit

class PiyoViewController: UIViewController, UIPageViewControllerDataSource {
    
    let colors = [UIColor.redColor(), UIColor.yellowColor(), UIColor.blueColor()]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let pageViewController = UIPageViewController(transitionStyle: UIPageViewControllerTransitionStyle.Scroll, navigationOrientation: UIPageViewControllerNavigationOrientation.Horizontal, options: nil)
        pageViewController.dataSource = self
        
        let startingViewController = viewControllerAtIndex(0)!
        let viewControllers = [startingViewController]
        pageViewController.setViewControllers(viewControllers, direction: .Forward, animated: false, completion: nil)
        pageViewController.view.frame = self.view.frame

        self.addChildViewController(pageViewController)
        self.view.addSubview(pageViewController.view!)
        pageViewController.didMoveToParentViewController(self)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    func viewControllerAtIndex(index: Int) -> HogeViewController? {
        if index >= colors.count {
            return nil
        }
        
        let hogeViewController = HogeViewController()
        hogeViewController.pageIndex = index
        hogeViewController.backgroundColor = colors[index]
        
        print(index)
        return hogeViewController
    }
    
    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
        var index = (viewController as! HogeViewController).pageIndex
        
        if index == 0 {
            print("before nil:: \(index)")
            return nil
        }
        
        index--
        
        print("before's return \(index)")
        
        return viewControllerAtIndex(index)
    }
    
    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
        var index = (viewController as! HogeViewController).pageIndex
        
        index++
        
        if index == self.colors.count {
            print("after nil")
            return nil
        }
        print("after's return  \(index)")
        return viewControllerAtIndex(index)
    }
    

    
}



```

```swift

import UIKit

class HogeViewController: UIViewController {
    
    var pageIndex: Int = 0
    var backgroundColor: UIColor?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = backgroundColor!
    }

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


```

##現時点でわかったことと謎

- 実際に乗せる、datasourceで必須なメソッドに返り値として渡してあげるViewControllerはその都度生成されたインスタンスでなければならない（？）

- 今回は同じViewControllerのClass(HogeViewController)からインスタンスを必要な分生成して表示しているが、別々のViewControllerのクラスを使用する場合、before, afterのpageViewControllerメソッドで以下のように処理をすることでできた（２つのViewControllerクラスを表示させている）

```swift
//beforeの方
//isFirstはBool型の変数。初期値はtrue
if isFirst {
            return nil
        } else {
            isFirst = true
            let showReviewViewController = ShowReviewViewController()
            return showReviewViewController
        }

```


## その他　

- UIPageViewControllerのインスタンス生成時に設定してるやつがなんなのかとか→ http://qiita.com/kumagi/items/289ccadf344f32613304

- その構成に関して 参照→http://qiita.com/yd_niku/items/b9f10bf5071971a1d8da
>親のUIViewControllerがUIPageViewControllerとUIPageViewControllerDataSource,、UIPageControlを持っていて遷移の概要を管理し、データそのものと中身のページは基本的にUIPageViewControllerDataSourceが与えるような感じみたいです。

<hr>
探してみるとけっこう情報が少なく手探り手探りな感じです・・・なにかいい記事などあれば紹介いただきたいです

## 追記

> 現時点でわかっていることと謎

の部分で述べた2つのviewControllerClassを表示させる場合について、スワイプするうちにViewControllerの表示数が増える謎挙動が起こったため、以下のようにクラス名を取得し、それによって条件わけをする方法をとることで解決した。

```swift

let className = NSStringFromClass(viewController.dynamicType).componentsSeparatedByString(".").last!

```

```swift

if className == "ShowReviewViewController" {
            let showReviewController = ShowChartViewController()
            return showReviewController
        } else if className == "ShowChartViewController" {
            return nil
        } else {
            return nil
        }

```

- 新たな謎

beforeやafterのpageViewControllerメソッドの呼ばれるタイミングがことごとく謎。
右にスワイプ（つまりafterが呼ばれるはず）したときにはなぜかafterの後にbeforeが呼ばれるなど謎極まりない・・・