Appleからの試練が俺を強くする

戦闘民族は死の淵から蘇ることにより戦闘力を増すことができる。連休中(というか一週間過ぎてしまったが)にいろいろアプリを作りたかったのだけど、iOS7がリリースされたということもありiOS7向けアプリ開発の勉強がメインになった。覚えたこと紹介する。

CoreData

これはiOS7は関係ない。データを保存したくなったけど直接SQLiteをつかうのが面倒になり、objectキャッシュで済ませようかと悩んだけど、いい機会なのでCoreDataを勉強した。

CoreDataは慣れると便利だが、取っ付き易いとはいえない。RailsのActiveRecordなどのように事前にモデルを設計しておく必要があるが、それがyamlなどのテキストベースではなくXcode上の設計ツールから行わないといけない。xcdatamodeldという拡張子のファイルを作成し、xcdatamodeldファイルはビルド時にmomdファイルにコンパイルされるようだ。

CoreDataは日本語の公式ドキュメント PDF もあるので詳しくは書かないがモデル設計を終えても実装が面倒で、どれくらい面倒かというとAppleのドキュメントにCore Data Snippetsがあるくらい。

検索してデータを書き換えて保存するだけでも結構な行数になる。Snippetsが示すようにモデルが変わってもやることは同じなのでおそらく簡単にかけるライブラリを誰か作っていると思うが、まずは勉強ということで直接CoreDataを使ってみた。面倒なことも多いが慣れてみれば自前でSQLiteをつかうよりも楽だ。iCloudの同期を想定していたりするので、Webフレームワーク系のORMと多少扱いが違うのもしょうが無いないかと納得もした。

とは言え実装が面倒なので次回からはActiveRecord風に操作できるライブラリでも探そうと思う。

StoryBoard + ChildViewController

多分そろそろInterface Builder(以下IB)を使わない人は減っていくのだろうと思う。ちなみに僕は基本的に面倒なことが嫌いで、コードで設計した方が早いならそうするしIBを使った方が楽ならそうする。楽をするためなら苦労は厭わない。

StoryBoardの利用促進としてChildViewControllerを紹介しておく。これは第3回 iphone_dev_jp 東京iPhone/Mac勉強会で学んだ。
参考: 第3回 iphone_dev_jp 東京iPhone/Mac勉強会 資料

StoryBoardではView単位で設計ができないので画面の一部(SubView)を設計する場合に活用できないように見える。

実はiOS5から、StoryBoard対応と同時にUIViewControllerには他のViewControllerをchildViewControllerとして扱う機能が追加されている。childViewController.viewをsubViewに追加することでStoryBoardで設計した別のシーンをsubViewとして追加できる。

addChildViewControllerの良いところはviewDidLoadなどのイベントを子のViewControllerでも使えるところ。つまり操作処理を(Child)ViewControllerにカプセル化することができる。またユニバーサルアプリを作る場合にiPadではchildViewController(subView)として使い、iPhoneでは1つのシーンでつかうというような再利用もできる。

またContainerViewを使えばIBの中からでも関連付けが可能になる。
参考: Storyboardの”ContainerView”を使ってみる

別に100個も200個も追加するわけじゃないので、ViewControllerのオーバーヘッドとか気にしてもしょうが無いと思って画面の一部も別のViewControllerとして積極的に設計していくことを覚えた。

AutoLayout

AutoLayoutはiOS6からのサポートなのでiOS5がターゲットだと使っていなかった。しかしiOS7対応で心が折れたので使ってみた。

iOS7では画面にステタースバーを含めてレイアウトしないといけないのでステータスバーに重複しないように画面上部20pxを意識して設計しないといけない。しかしこれをiOS6で動かすとぽっかり20pxの余計な空白が開いてしまう。Appleが課したとてつもない試練だ。

正直OSのバージョンを判定してViewのframeを1つずつ設定していくこんな世の中じゃ。ポイズン。と絶望した。そしてAutoLayoutを覚えることにした。もう新しいアプリではiOS5を切ると決めた。

このあたりの対応の話はQiitaにまとめておいた。
参考: iOS7ステータスバー対策まとめ

AutoLayoutははっきり言ってじゃじゃ馬である。何か設定をしくると容赦なく実行時にレイアウトできん!とエラーが起きる。何か新しい設定を追加すると他の設定が崩壊することもある。微妙なバランスが崩れると設定した値が消えてしまったり、いつの間にか同じ場所の設定が複数入っていたりなんだかよくわからない状態になっていく。

IBを使いたくない気持ちは俺も理解している。何度も投げだしたくなったがframeを設定していく世には戻りたくないのでがんばった。一日くらいやると慣れて何をすると崩壊するのかだんだんわかってきた。うまく説明できないがXcodeに矛盾を感じさせないように設定を追加していくことが重要となる。AutoLayoutはまるでジェンガのようだ。

まとめ

時にXcodeを投げ出したいこともある。テキストのソースコードだけを相手したいこともある。Xcodeを強いられるのはある種Appleからの試練のようなものだ。

ただ開発環境はプラットフォームと共に進化しているのでそれから目をそむけていると返って無駄な苦労を強いられかねない。もちろんXcodeを使わない縛りでも強くなれることもあるだろうが、Xcodeに立ち向かうことで日々の開発が楽になることもあるよ、ということを今回は言いたかった。