iOS5では使えない…Xcode4.5の新機能、StoryboardでのContainer Viewが便利!

このエントリーをはてなブックマークに追加
はてなブックマーク - iOS5では使えない…Xcode4.5の新機能、StoryboardでのContainer Viewが便利!

追記:テストの際の勘違いで、iOS5ではクラッシュしてしまいます。iOS5でテストしたつもりのデバイスが、既にiOS6にアップしていました。間違った情報を流してしまい、申し訳ありません。指摘して下さった、内田宏基@東京都 (_danwaneji)さんにも感謝します。


Xcode4.5使っているでしょうか?iOS6/iPhone5対応のために使わざるを得ないという方も少なくないと思います。多くの新機能は、iOS6以降のみの機能のため、iOS5対応アプリででは、一部しか使えなかったり、条件判断して使わなければいけなかったりします。今回は、Xcode4.5の新機能で、iOS5プロジェクトでも使える、StoryboardでのContainer Viewについて紹介します。

Container View – ChildViewControllersとは、

Container Viewとは、iOS5から使用できるようになった、ChildViewControllersを用いた、ViewControllerないに、ViewControllerを子どもとして持たせて、一つの画面の中に、複数のViewControllerを子どもとして持たせることが出来る機能です。この機能によって、Viewのパーツ化を進めることが出来、部分的な再利用も可能になるとともに、アニメーションされた独自のナビゲーション機能を作ることも容易になります。これについては、7月のiPhone_dev_jp勉強会で私の発表したスライドが参考になるかもしれません。
第3回iphone_dev_jp 東京iPhone/Mac勉強会で発表しました。 | Zero4Racer PRO Developer’s Blog
スライドも置いておきます。

iOSがリリースされたときは、画面サイズの制限、また、メモリ制限のために、複雑なビューを作ることは、現実的ではありませんでしたが、iPadの登場により画面が大きくなり、また、iPhone 5になり画面サイズも変更されたため、画面の部品を違うViewControllerで管理するというのが効率的になりました。
WWDC2012のビデオのsession236 – the evolution of ViewController でも、そのことが説明され、親のViewControllerが、子どものViewControllerのサイズをコントロールするのが現実的であることが説明されました。この、ChildViewControllerのフレームワークにより、これまでのViewControllerの考え方と大きく変化が生じました。これまでは、すべてのViewControllerがUIWindowとの関係を考えながらプログラムしていたのですが、ChildViewController後は、それぞれのViewControllerは、自分の親ViewControllerから指定されたサイズの中で何をするかだけを考えればよいようになり、AppDelegateと、RootViewControllerが、デバイス、またUIWindowのプロパティを考慮して、ChildViewContollerを制御するようになりました。

XcodeのCotainerView

ChildViewControllerを動的にアニメーションして作成するためにはコードを記述するか、Segueを定義して移動する必要がありますが、静的に配置するために使用できるのが、この、Container Viewです。これを、Viewの中に配置すると、埋め込む為に使用するViewControllerを作成してくれます。

ContainerView使用例
ContainerView使用例

それでこの中身の部分を一つのViewControllerとしてデザインすることが出来ます。この内部の部品には、UITableViewControllerを使用することが出来ます。また、共通の部品として使用できるのであれば、複数のViewControllerから、一つのViewControllerを埋め込むことが出来ます。
シミュレータでは次の用に実行されます。
実行例
実行例

内部的には、Viewが生成されるときに、自動的にContainer View内のViewControllerを生成して、ChildViewControllerとして登録され、Container ViewのFrameにあわせて、ChildViewを配置してくれるところまでを行ってくれます。
便利なのが、この処理が、iOS6だけではなくて、iOS5でもこの実行を自動で行ってくれることです。Xcode4.4以前は、同じことを行うために、Viewの中に空のPlaceHolderのためのViewを置いて、そのFrameにあわせて登録するということを行っていましたが、それを自動で行ってくれるのはとてもうれしいです。勘違いで、iOS5では動きません。iOS5対応の場合は、同じことを行うために、Viewの中に空のPlaceHolderのためのViewを置いて、そのFrameにあわせて登録する方法が便利です。

活用例

活用例としてはいくつか考えられます。

  1. 共通部品のデザイン
  2. ViewControllerの一部に、StaticのTableViewを置く
  3. StaticのTableViewは、UITableViewControllerのトップに置かれないといけないというルールがありますが、ChildViewに入れてしまえば、簡単にViewの一部にスタティックのテーブルを置くことが出来ます。

ChildViewControllersの考え方は、UIViewController全体の設計に非常に大きな影響を与えている技術なので、これからのViewControllerプログラミングに必須の技術ということが出来ると思います。

参考:
View Controller Programming Guide for iOS: About View Controllers
WWDC 2012 Session Videos – Apple Developer – The Evolution of View Controllers on iOS

Comments

comments

Powered by Facebook Comments

3 comments

  1. niwatako

    iOS5のiPadで利用しようとしましたが、
    次のようなエラーで落ちてしまいます。

    iOS5でも利用できるとのことですが、
    何か留意することはありますでしょうか。

    Terminating app due to uncaught exception ‘NSInvalidUnarchiveOperationException’, reason: ‘Could not instantiate class named UIStoryboardEmbedSegueTemplate’

    • admin

      こちら、私のテストの際の勘違いで、iOS5では動かない機能でした。iOS5で使用する場合には、ビューを起きたい場所に、空のビューを置いて、コードでビューを追加することにより対応できます。

Post a comment

You may use the following HTML:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">