インタラクションを定義する
iOS アプリは、イベント駆動型プログラミング に基づいています。すなわち、システムイベントとユーザのアクション:アプリの流れは、これらのイベントによって決定されます。ユーザーがアプリでイベントを引き起こすと、インターフェイス上でアクションを実行します。これらのイベントは、アプリのロジックとそのデータの操作の実行となります。ユーザーのアクションへのアプリの応答がインターフェイスに反映されます。開発者ではなくユーザーは、アプリのコードの特定の部分が実行されるときの制御下にあるので、あなたは正確にどのアクションをユーザーが実行することができ、それらのアクションに反応して何が起こるを識別できます。
ビューコントローラ内にイベント処理ロジックの多くを定義します。コントローラ は、ユーザのアクションに応答してビューのサポートをするオブジェクトであり、コンテンツで占められるビューです。コントローラ・オブジェクトは、ビューが、データ・モデルとの対話を通じる導管です。ビューはアプリのコントローラを介して、モデルデータの変更が通知され、コントローラは、ユーザによる変更-例えば、テキストフィールドに入力されたテキスト-をオブジェクト・モデルに通信します。それらはユーザーのアクションに応答するか、ナビゲーションを定義しているか、コントローラが、アプリの動作を実装しているかに反応します。
ビューコントローラ
基本的なビュー階層を構築した後の、次のステップは、視覚的な要素を制御し、ユーザー入力に応答することです。 iOS アプリでは、サブビューのその階層とコンテンツビューを管理するために、ビューコントローラ(UIViewController)を使用します。
ビューコントローラはビュー階層の一部ではなく、またあなたのインターフェイス内の要素でもありません。代わりに、階層内のビューオブジェクトを管理し、動作でそれらを提供します。ストーリーボードにビルドする各コンテンツビュー階層は、インタフェース要素を管理し、ユーザーとの対話に応じてタスクを実行するための責任があるビューコントローラを必要とします。これは通常、各コンテンツ·ビュー階層のカスタムの UIViewController サブクラスを書くことを意味します。アプリが複数のコンテンツビューを持っている場合は、それぞれのコンテンツビューに別のカスタムの View Controller クラスを使用します。
ビューコントローラは、多くの役割を果たしています。これらは、アプリのデータモデルとデータを表示するビューの間の情報の流れを図り、コンテンツビューの寿命を管理し、デバイスが回転したときに向きが変化することを扱います。しかし、おそらくその最も明白な役割は、ユーザー入力に応答することです。
また、一つのコンテンツの型から別の型への移行を実現するために、ビューコントローラーを使用します。iOS アプリのコンテンツを表示するスペースは限られているので、ビューコントローラは、1つのビューコントローラからビューを削除し、別のビューに置き換えるために必要なインフラストラクチャを提供します。
アプリ内の相互作用を定義するには、ビューコントローラのファイルとストーリーボードのビューが通信するようにします。アクションとアウトレットを通じてストーリーボードとソースコードファイル間の接続を定義することによってこれを行います。
アクション
アクションは、アプリで発生する可能性のある、イベントにリンクされたコードの一部です。そのイベントが発生すると、コードが実行されます。ユーザーインターフェイスを更新するデータの一部を操作する事で何かを達成するためのアクションを定義できます。ユーザーまたはシステムイベントに応答して、アプリの流れを動かすためのアクションを使用します。
IBAction の戻り値の型と sender パラメータを持つメソッドを作成し、実装することで、アクションを定義します。
- (IBAction)restoreDefaults:(id)sender;
sender パラメータは、アクションを引き起こす責任があるオブジェクトへのポインタです。 IBAction の戻り値の型は、特別なキーワードであり、それは、void キーワードのようなものですが、このメソッドを使用すると、Interface Builder の (このキーワードに IB の接頭辞が付いている理由です) ストーリーボードから接続可能なアクションであることを示しています。ストーリーボードでの要素にアクション IBAction をリンクする方法についての詳細を、チュートリアル:ストーリーボード で学びます。
アウトレット
アウトレット は、ソースコードファイルからストーリーボードへとオブジェクトを追加し、インターフェイスからオブジェクトを参照する方法を提供します。ビュー·コントローラ·ファイルにストーリーボード内に特定のオブジェクトから Control- ドラッグでアウトレットを作成します。これは、実行時にコードから、そのオブジェクトにアクセスして操作することができるように、ビューコントローラ・ファイル内にオブジェクトのプロパティを作成します。例えば、第二のチュートリアルでは、コード内のテキストフィールドの内容にアクセスできるように、ToDoList アプリでテキストフィールドのためのアウトレットを作成します。
アウトレットは、 IBOutlet プロパティとして定義されます。
@property (weak, nonatomic) IBOutlet UITextField *textField;
IBOutlet キーワードを使用すると、Interface Builder からこのプロパティに接続できると Xcode に伝えます。 チュートリアル:ストリーボード で、ストーリーボードからソースコードにアウトレットを接続する方法の詳細を学びます。
コントロール
コントロール は、ボタン、スライダー、またはスイッチのようなユーザー・インターフェース・オブジェクトであり、ユーザーはコンテンツを操作したり、入力を提供したり、アプリ内で移動して、あなたが定義したように他のアクションを実行します。コントロールは、コードがユーザー·インターフェースからのメッセージを受信する方法を提供します。
ユーザーがコントロールを操作すると、コントロール・イベントが作成されます。コントロール・イベント は、コントロールから指を持ち上げたり、コントロール上で指をドラッグしたり、テキストフィールド内でタッチダウンしたりなどの、ユーザーがコントロール上で作り上げられる様々な物理ジェスチャーを表します。
コントロール/・イベントには一般的なカテゴリが三つあります。
- タッチとドラッグのイベント。これは、ユーザーがコントロールにタッチかドラッグして相互作用したときに発生します。ユーザが最初にボタンに指をタッチすると、例えば、タッチダウン・インサイドのイベントが引き起こされます。ユーザーがボタンの外にドラッグした場合、それぞれのドラッグイベントが引き起こされます。ユーザーがボタンの橋の境界内にいながらボタンから指を離すと、タッチアップ/インサイドが送信されます。ユーザーがタッチをキャンセルせず、指を離す前に、ボタンの外に指をドラッグした場合は、タッチアップ/アウトサイドイベントが引き起こされます。
- イベント編集。ユーザーがテキストフィールドを編集すると、編集イベントが発生します。
- 値変更イベント。異なる一連の値を発生させる、コントロールをユーザーが操作したときに値変更イベントが発生します。
相互作用を定義するように、あなたのアプリ内のすべてのコントロールに関連付けられるアクションを知り、インターフェイス内のユーザーにそのコントロールの目的が明確になるようにします。
アプリが複数のコンテンツビューの階層を持っている場合は、それらの間で移行できるようにする必要があります。このためには、ビューコントローラの特殊なタイプを使用します:ナビゲーションコントローラ (UINavigationController) です。ナビゲーション・コントローラ は、一連のビューコントローラーを通して、前後の遷移を管理し、ユーザーが iOS の Mail アプリ内の電子メールアカウント、受信メッセージ、および個々の電子メールを移動するときなどを管理します。
特定のナビゲーション・コントローラが管理する一連のビューコントローラは、ナビゲーション・スタックと呼ばれます。ナビゲーション・スタック は、カスタム・ビュー・コントローラー・オブジェクトの、最後に入れた物が最初に出て来る仕組みです。スタックに追加された最初の項目は、ルート・ビュー・コントローラー となり、スタックからはじき出されることはありません。他のビュー・コントローラーは、ナビゲーション・スタックに積み上げたり、はじき出されたりします。
ナビゲーション・コントローラの第一の仕事は、コンテンツ・ビュー・コントローラの表示を管理することですが、それはまた、独自のカスタム・ビューを提示するための責任があります。具体的には、ナビゲーション階層、つまり[戻る]ボタンと、カスタマイズ可能なボタンが含まれる階層の中で、ユーザーの場所に関するコンテキストを提供し、画面最上部のナビゲーション·バーを提示します。ナビゲーション・スタックに追加されているすべてのビューコントローラーは、このナビゲーションバーを提示します。あなたは、ナビゲーションバーを設定する責任があります。
あなたは一般的には、ナビゲーション・スタックからビューコントローラーをはじき出す作業を行う必要はありません。ナビゲーション・コントローラが提供する[戻る]ボタンが、これを処理します。ただし、スタックにビュー・コントローラを積み上げるのは手動でしなければなりません。ストーリーボードを使ってこれを行うことができます。
ナビゲーションの定義にストーリーボード
これまでのところ、ストーリーボードを使って、アプリ内のコンテンツを一つの画面として作成する方法について学びました。さて、あなたのアプリ内の複数のシーン間のフローを定義するためにそれらを使用する方法について学習します。
最初のチュートリアルでは、作業していたストーリーボードは、一つのシーンしか持っていませんでした。ほとんどのアプリでは、ストーリーボードは、それぞれがビューコントローラとそのビュー階層を表す、いくつものシーンの並びから構成されています。シーンは2つのビュー・コントローラ (ソースとデスティネーション) 間の遷移を表す セグエ によって接続されています。
ストーリーボードで作成できるセグエにはいくつかの種類があります。
- 提示。提示セグエは、現在のビュー・コントローラのスタックの一番上に新しいコンテンツをプッシュします。コンテンツが表示される場所は、シーン内のビューコントローラのレイアウトに依存します。
- 詳細の表示。詳細の表示セグエは、現在のビュー・コントローラのスタックの一番上に新しいコンテンツをプッシュするか、またはシーン内のビュー・コントローラのレイアウトに応じて表示される内容を置き換えます。
- モーダルの表示。モーダルセグエは、アプリのメインフローに戻る前に提示される、コントローラ上に操作を実行するようユーザーに要求する、別のコントローラにモーダルを提示するビュー・コントローラです。モーダルビュー:コントローラは、ナビゲーション・スタックに追加されるのではなく、一般的に提示中のビュー・コントローラの子であると考えられます。提示されるビュー・コントローラは、それが作成し、提示するモーダルビュー・コントローラを片付ける責任があります。
- ポップオーバーの表示。提示されたビュー・コントローラは、既存のビューに固定されたポップオーバーとして示されます。
- カスタム。UIStoryboardSegue をサブクラス化することで、独自のカスタム遷移を定義できます。
- 逆移動。セグエ逆移動は、ビュー・コントローラの既存のインスタンスにユーザーを戻すために一つ以上のセグエを逆方向に移動します。逆移動を実装するためにセグエ逆移動を使用します。
セグエに加えて、シーンも 関係 によって接続できます。例えば、ナビゲーション・コントローラとそのルート・ビュー・コントローラの間の関係があります。この場合、その関係は、ナビゲーション・コントローラによるルート・ビュー・コントローラの封じ込めを表しています。
これで、ストーリーボードでビューとビュー·コントローラの作業の基礎を学んだので、次のチュートリアルで ToDoList アプリにこの知識を取り入れる時が来ました。
前の章:ユーザーインターフェースデザイン
次の章:チュートリアル:ストーリーボード