UIViewControllerのサンプルコードはいつも使ってるので、他のサンプルコードもひと通り試してみることにした。
今回はUIPageViewControllerのサンプルコード触ってみた。
コレね。
自分でちょっとコードをいじったやつをGithubに置いてるー。ほとんどサンプルコードのまま。
無駄に頑張って無限ページスクロールできるようにしたけど、何も役に立たない・・・。
UIPageViewControllerについて
Androidで例えると、ViewPagerみたいなものだろーみたいなノリで考えてた。
認識的にはほとんど間違ってなかったけど、サンプルコードをパッと見た感じ、最初は「は??わかんねー」ってなった。
とりあえずUIPageViewControllerのReferenceはこれ。
サンプルコードでは、「DataViewController.swift」、「ModelController.swift」、「RootViewController.swift」ってクラスが重要になってくる。
以下のような順番で読んだ。RootViewControllerのviewDidLoadから読めば、そうなるよね。
RootViewController.swift -> ModelController.swift -> DataViewController.swift
まず気になったのが、ページのスクロールが横スクロールだったこと。
navigationOrientationをVerticalにすれば、簡単に縦スクロールになった!
// 横スクロール navigationOrientation: .Horizontal self.pageViewController = UIPageViewController(transitionStyle: .PageCurl, navigationOrientation: .Horizontal, options: nil) // 縦スクロール navigationOrientation: .Vertical self.pageViewController = UIPageViewController(transitionStyle: .PageCurl, navigationOrientation: .Vertical, options: nil)
各ページのViewってどれが設定されてるの?どうやって設定してるの?
次に気になったのが、各ページのViewってどれが設定されてるの?どうやって設定してるの?ってこと。
UIPageViewControllerってページャーできるUIを提供するものであって、各ページのViewは独自で作ったViewになる。
各ページに設定されるViewControllerは、DataViewControllerになる。コードだけ抜き出すと、以下のような感じで設定してる。
let startingViewController: DataViewController = self.modelController.viewControllerAtIndex(0, storyboard: self.storyboard!)! let viewControllers = [startingViewController] self.pageViewController!.setViewControllers(viewControllers, direction: .Forward, animated: false, completion: {done in })
setViewControllersメソッドで、表示するViewControllerを設定してるってわけ。
ModelControllerの役割
ModelControllerは、ページ IndexごとのViewControllerを管理するクラスって感じかなー。
このクラスでDataViewControllerの生成を行ってるんですよ。
なのでサンプルコード見ると、うまくMVCっぽくクラスごとに役割が分かれてるって感じなんですかね。
ちょっとココらへん混乱したけど、UIPageViewControllerDataSourceとかがわかればスッキリするのかなー。
Viewのライフサイクル
どうやらiOSにもViewのライフサイクルがあるみたい。
ViewのライフサイクルとUIViewControllerのライフサイクルは別物なのかな??
UIViewControllerのライフサイクルは、AndroidでいうところのActivityのライフサイクルって感じ。雑に言うと。
とりあえず参考になりそうな記事だけまとめておく。これは理解した方がよいので、また別の機会にしっかり学ぼう。
AnyObjectって何??
すげー前から気になってたAnyObjectさん。
今回動かしたサンプルコードにも出てきて、さすがに何者なのか調べてみた。
Anyだから直訳?すると「なんでも入るObject」って感じだよね。
んで、この記事読んでみた。
Anyっていうのもあるのか!知らなかった・・・。
結果的にAnyObject = 「なんでも入るObject」はなんとなく当ってた。
ただ、AnyObjectでは関数や構造体が入れられないので、それらを入れるときにはAnyを使うって書いてあった。
実際にAnyObjectとAnyってどんな感じで使われてるのかピンと来ないので、できるiOSエンジニアに聞いてみよー。
JavaでいうとObjectクラスだよね。Objectクラスを多様するようなことってあんまりないから、AnyObjectはどうなのか気になる。
ちなみに、Swiftの公式ドキュメントで "Type Casting for Any and AnyObject" って話も書いてあるから読むといいかも。
Swift
iOS書き始めたはいいけどSwiftがあんまりわかってないので、そこそこコードの意味がわからなくて苦戦してる。
Swiftのドキュメント見つけたので、細かいこととかこれ見ていこうかと思ってる。
Swiftのドキュメントとかサンプルコードとか色々ここにまとまってるので、これも見るとよさそう。
Storyboardで定義したViewControllerを呼び出す
サンプルコードでViewControllerの生成方法で見慣れないコードがあったので調べてみた。
こんな感じのコード。
let dataViewController = storyboard.instantiateViewControllerWithIdentifier("DataViewController") as! DataViewController
どうやらStoryboard上で定義したViewControllerをinstantiateViewControllerWithIdentifierメソッドで生成できるらしい。
引数にはStoryboard上で定義したViewControllerのStoryboard IDを指定するみたい。
これはいい勉強になったなー!でもこれってどれだけ使われる手法なんだろ?
調べてヒットした記事はこれ。
とりあえずUIStoryboardのReferenceページも貼っておく。
気になったけどわかってないこと
気になったけど、調べてもよくわからなかったことをまとめとく。
今後わかったら書いていくためにも、メモっておかないと。
まとめ
UIViewController以外のサンプルコードを動かしてみてとても良かった。
UIPageViewControllerってみんな使ってるのかわからないけど、結構使いやすい感じのUI Frameworkだからいいかもなー。
とにかくサンプルコードとか色々試してみて、わかったことをひたすらOutputしていこう。