UIPageViewController / Viewのライフサイクル / AnyObject などなど・・・

UIViewControllerのサンプルコードはいつも使ってるので、他のサンプルコードもひと通り試してみることにした。

今回はUIPageViewControllerのサンプルコード触ってみた。

f:id:operando:20150714221933p:plain

コレね。

自分でちょっとコードをいじったやつをGithubに置いてるー。ほとんどサンプルコードのまま。

無駄に頑張って無限ページスクロールできるようにしたけど、何も役に立たない・・・。

github.com

UIPageViewControllerについて

Androidで例えると、ViewPagerみたいなものだろーみたいなノリで考えてた。

認識的にはほとんど間違ってなかったけど、サンプルコードをパッと見た感じ、最初は「は??わかんねー」ってなった。

とりあえずUIPageViewControllerのReferenceはこれ。

developer.apple.com


サンプルコードでは、「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のライフサイクルって感じ。雑に言うと。

とりあえず参考になりそうな記事だけまとめておく。これは理解した方がよいので、また別の機会にしっかり学ぼう。

qiita.com

blog.livedoor.jp

qiita.com

AnyObjectって何??

すげー前から気になってたAnyObjectさん。

今回動かしたサンプルコードにも出てきて、さすがに何者なのか調べてみた。

Anyだから直訳?すると「なんでも入るObject」って感じだよね。

んで、この記事読んでみた。

qiita.com

Anyっていうのもあるのか!知らなかった・・・。

結果的にAnyObject = 「なんでも入るObject」はなんとなく当ってた。

ただ、AnyObjectでは関数や構造体が入れられないので、それらを入れるときにはAnyを使うって書いてあった。

実際にAnyObjectとAnyってどんな感じで使われてるのかピンと来ないので、できるiOSエンジニアに聞いてみよー。

JavaでいうとObjectクラスだよね。Objectクラスを多様するようなことってあんまりないから、AnyObjectはどうなのか気になる。

ちなみに、Swiftの公式ドキュメントで "Type Casting for Any and AnyObject" って話も書いてあるから読むといいかも。

developer.apple.com

Swift

iOS書き始めたはいいけどSwiftがあんまりわかってないので、そこそこコードの意味がわからなくて苦戦してる。

Swiftのドキュメント見つけたので、細かいこととかこれ見ていこうかと思ってる。

developer.apple.com


Swiftのドキュメントとかサンプルコードとか色々ここにまとまってるので、これも見るとよさそう。

developer.apple.com

Storyboardで定義したViewControllerを呼び出す

サンプルコードでViewControllerの生成方法で見慣れないコードがあったので調べてみた。

こんな感じのコード。

let dataViewController = storyboard.instantiateViewControllerWithIdentifier("DataViewController") as! DataViewController

どうやらStoryboard上で定義したViewControllerをinstantiateViewControllerWithIdentifierメソッドで生成できるらしい。

引数にはStoryboard上で定義したViewControllerのStoryboard IDを指定するみたい。

これはいい勉強になったなー!でもこれってどれだけ使われる手法なんだろ?


調べてヒットした記事はこれ。

qiita.com

とりあえずUIStoryboardのReferenceページも貼っておく。

developer.apple.com

気になったけどわかってないこと

気になったけど、調べてもよくわからなかったことをまとめとく。

今後わかったら書いていくためにも、メモっておかないと。

  • NSArrayとは??SwiftのArrayとの違いは??
  • XcodeのCode FormatterってどのPlugin使うのがいいのか
  • NSDateFormatterの使い方とか

まとめ

UIViewController以外のサンプルコードを動かしてみてとても良かった。

UIPageViewControllerってみんな使ってるのかわからないけど、結構使いやすい感じのUI Frameworkだからいいかもなー。

とにかくサンプルコードとか色々試してみて、わかったことをひたすらOutputしていこう。