UIViewControllerクラス

2010. 08. 16
●UIViewControllerクラス

UIViewControllerクラスは、iPhoneアプリケーションのビュー管理モデルの基礎を提供します。

基本的なビューコントローラクラスは、関連付けされたビューの提示に加え、モーダルビューの管理のための基本的なサポートと、デバイスの向きの変更に対応したビューの回転をサポートします。

UINavigationControllerやUITabBarControllerなどのサブクラスは、ビューやビューコントローラの複雑な階層の管理に、補足的な動作を提供します。

フルスクリーンのビューの管理には、UIViewControllerの各インスタンスを使用します。

単純なビューコントローラでは、アプリケーションのコンテンツを提示するために、ビュー階層の管理を伴います。

典型的なビュー階層は、ルートビューと実際にコンテンツを提示する(このクラスのビュープロパティ内で参照可能な)一つ以上のサブビューで構成されます。

ナビゲーションとタブバーコントローラの場合は、ビュー階層の高いレベルだけでなく(これはナビゲーションコントロールが提供します)、アプリケーションのコンテンツを提示する処理として一つ以上の追加されたビューコントローラの管理も行います。

:ウィンドウの一部分のみを満たすビュー(つまりアプリケーションのコンテンツの矩形により定義された一部の領域のみ)の管理に、ビューコントローラを使用しないでください。
いくつかの小さなビューで構成されたインターフェイスにしたい場合は、一つのルートビューに全て埋め込み、ビューコントローラでビューを管理してください。

ビューコントローラはビューを管理する義務があり、またイベント処理に使われるレスポンダチェーンの一部でもあります。

ビューコントローラは自身がUIResponderクラスの子孫であり、ビューとスーパービュー間の管理をレスポンダチェーン内に挿入します。

したがって、ビューコントローラにより管理されているビューでイベント処理ができない場合、ビューコントローラにイベントが渡され、その次のイベント処理が選択されるか、またはビューのスーパービューに転送されます。

UIViewControllerクラスは、デバイスの向きの変更に応答してビューコントローラのビューを回転させるためのサポートを、自動的に提供します。

自動回転の動作の一部として、ビューコントローラは全てのタブバーまたはナビゲーションバーをビューの外へスライドし、基礎となるビューを新しい向きにし、バーを元の位置にスライドします。

ビューの自動リサイズプロパティが既に設定されいる場合、この動作は基本的に自動で行われます。

回転動作をカスタマイズしたい場合は、アニメーションを追加指定して実行することもできます。

ビューコントローラは、ほとんどのiPhoneアプリケーション設計の基礎となります。

以下の項で、UIViewControllerクラスのメソッドとプロパティの使い方について、基本的な情報を提供します。

アプリケーションのユーザインターフェイスの構築と管理でのビューコントローラの使い方についての詳細は、『iOS View Controllerプログラミングガイド』を参照してください。


他のビューコントローラを伴ったビューコントローラの使用

ビューコントローラは単独で動作することはほとんどありません。

アプリケーションでナビゲーションやタブバーコントローラ、またはモーダルビューを提示する場合、通常それらナビゲーション機能の実装には、いくつかのビューコントローラが相互に作用します。

ナビゲーションコントローラのインターフェイスはUINavigationControllerオブジェクトで構成され、別のナビゲーション画面に一つ以上のカスタムビューコントローラを提供します。

ユーザがインターフェイス内の新しいアイテムを選択すると、ナビゲーションスタックに新しいビューコントローラをコードがプッシュします。

新しいビューコントローラは、それぞれ新しい画面にコンテンツの内容を表示します。

スタックからのビューコントローラの削除を管理するには、各ビューコントローラに関連付けされたナビゲーションアイテムにナビゲーションを戻します。

navigationItemプロパティを変更することによって、ビューコントローラに与えるナビゲーションアイテムを設定することができます。

タブバーコントローラのインターフェイスはUITabBarControllerオブジェクトで構成され、各タブに一つ以上のビューコントローラがあります。

tabBarItemプロパティ内のオブジェクトを変更することによって、ルートビューコントローラが各タブに表示する情報を設定することができます。

iOSでは、現在のビューコントローラからモーダルビューのコントローラを提示して、モーダルビューを表示することができます。

presentModalViewController:animated:メソッドを使ってモーダルビューを提示する場合、ビューコントローラは指定した処理方式を使ってビューの外観をアニメーションします。
(modalTransitionStyleプロパティを設定することにより、望む処理方式を指定することができます)

このメソッドは同時に、現在のビューコントローラとモーダルビューコントローラの間に親子関係を生成します。

ビューコントローラ間の関係はかなり複雑で、各ビューコントローラオブジェクトは他のビューコントローラによって管理されているかどうかを示すプロパティを持っています。

タブバーまたはナビゲーションバーインターフェイスの内部に埋め込まれている場合、ビューコントローラのtabBarControllerまたはnavigationControllerプロパティで確認することができます。

また、parentViewControllerプロパティを使って、コントローラの直接の親コントローラを見つけることができます。

複雑なナビゲーションインターフェイスの構築と、ビューコントローラとの関係についての詳細は『iOS View Controllerプログラミングガイド』を参照してください。


サブクラス化の注意

通常iPhoneアプリケーションには、通常少なくとも一つ、たいていは複数のUIViewControllerのカスタムサブクラスがあります。

iOSベースのデバイスには使用可能な画面空間が限られるため、インターフェイスは通常表示する情報を一つ以上に分割する必要があります。

UIViewControllerのサブクラスによって管理されたそれぞれ異なる画面を使ってビューを表示します。

各ビューコントローラオブジェクトのジョブは二倍です。

ビューコントローラはアプリケーションのコントローラレイヤの一部で、アプリケーションの視覚的な提示(カスタムビュー)とアプリケーションのデータモデル(カスタムオブジェクト)間の相互作用を調整する責任があるからです。

ビューコントローラはまた、ビューレイヤを構成するビューの変更を処理する責任があります。

例えばデバイスの向きをポートレートからランドスケープに回転させた時、ビューコントローラはそれに応じてビューを新しい方向に向けます。

幸いなことに、ビューレイヤの管理に必要な作業のほとんどの処理は、UIViewControllerクラスのデフォルトの動作になっています。

ビューの初期設定とデフォルトの動作は全て指定しなければなりません。

その後、ビューとデータモデル間の相互作用に焦点を当てることができます。

UIViewControllerの新しいサブクラスを定義する時、コントローラで管理するビューを指定する必要があります。

これらのビューの指定には、手動またはnibファイルを使った二つの相互に排他的な方法があります。

ビューを手動で指定する場合、loadViewメソッドの実装と、それを使用してビュープロパティにルートビューオブジェクトを割り当てる必要があります。

ビューをnibファイルを使って指定する場合、loadViewをオーバーライドせず、代わりにInterface Builderでnibファイルを生成し、initWithNibName:bundle:メソッドを使ってビューコントローラオブジェクトを初期化してください。

nibファイルを使ったビューの生成は、(プログラミングによるものとは対照的に)ビューをグラフィカルに構成でき、Interface Builderアプリケーションを使って多くの場合簡単に生成することができます。

双方の手法は最終的に同じ結果を得られますが、ビューの設定に適した生成をし、ビュープロパティを経て公開します。

重要:ビューコントローラは、ビューと関連する全てのサブビューの唯一の所有者です。
したがって、メモリ不足状態の間やビューコントローラ自身が解放された時を含め、適切な時にビューの生成と解放する責任があります。
ビューがnibファイルに格納されている場合、各ビューコントローラオブジェクトは、nibファイル内のビューの独自コピーを生成します。
手動でビューを生成する場合、決して複数のビューコントローラで同じビューコントローラを使用しないでください。

ビュー階層のビューを生成する場合、ビューの自動リサイズプロパティを常に設定する必要があります。

ビューコントローラが画面表示する時、ルートビューは通常使用可能な領域に合わせてリサイズし、ウィンドウの現在の向きやステータスバーなど他のインターフェイスの要素によって変更されます。

自動リサイズプロパティは、Interface BuilderのInspectorウィンドウを使用して、または各ビューのautoresizesSubviewsとautoresizingMaskプロパティをプログラミングで変更して構成することができます。

これらのプロパティの設定は、ビューコントローラでポートレートとランドスケープの両方をサポートする際にも重要です。

向きを変更する際、システムはこれらのプロパティを使用して、ビューの再配置とリサイズを新しい向きに自動的に適合させます。


メモリ管理

メモリはiOSの重要なリソースで、ビューコントローラは重要な時にメモリのフットプリントを減らすためのサポートを組み込みで提供します。

UIViewControllerクラスはメモリ不足の状態になると、didMemoryWarningメソッドを通していくつかの自動処理を提供し、不要なメモリの解放を行います。

iOS 3.0より前は、このメソッドがカスタムビューコントローラクラスに関連付けされた追加メモリを解放する唯一の方法でしたが、iOS 3.0以降はviewDidUnloadメソッドによって最も必要な時により適切な場所で行うことができます。

メモリ不足の警告が発生した時、UIViewControllerクラスは後で再び再読み込みあるいは再生成可能なビューを解放します。

この場合viewDidUnloadメソッドを呼び出し、nibファイルで読み込まれたオブジェクトを含め、viewDidLoadメソッドで生成されたオブジェクト、実行時に後から生成されてビュー階層に追加されたオブジェクトなど、ビュー階層で関連付けされた全てのオブジェクトの所有権を放棄する機会をコードで与えます。

通常、ビューコントローラが(プロパティまたはIBOutletキーワードを含む変数の)アウトレットを含んでいる場合、アウトレットの所有権または不要になったビューに関連付けされた全ての他のデータを、viewDidUnloadメソッドを使って放棄する必要があります。

iOSのメモリ管理の実践についての一般的な情報とガイダンスについては、『高度なメモリ管理プログラミングガイド』を参照してください。


ビューの回転の処理

UIViewControllerクラスはデフォルトでは、ポートレートモードのみビューの表示をします。

向きを追加してサポートするにはshouldAutorotateToInterfaceOrientation:メソッドをオーバーライドし、YESを返される任意の方向をサブクラスでサポートする必要があります。

ビューの自動リサイズプロパティが正しく構成されている場合、全てしなければならない可能性があります。

しかし、必要に応じて追加動作を実装するための追加するフックをUIViewControllerクラスは提供しています。

不要になったまたは他の理由によって問題が生ずる可能性があって機能を一時的にオフにするには、willRotateToInterfaceOrientation:duration:メソッドをオーバーライドして必要なアクションを実行することができます。

その後、didRotateFromInterfaceOrientation:メソッドをオーバーライドし、向きの変更が完了したら機能を再度有効にするために使用します。

向きを変更する時のアニメーションをカスタマイズするには二つの方法があります。

向きの変更には二つの手順があり、回転が開始した通知、中間、そして終了した点を使用します。

ただしiOS 3.0では、一つの手順で向きの変更を実行できるようにサポートが追加されました。

向きを変更するには一つの手順の方が古い二つの手順より処理が速いので、一般的には新しいコードを推奨します。

一つの手順で向きを変更する追加されたアニメーションは、willAnimateRotationToInterfaceOrientation:duration:メソッドをオーバーライドしてアニメーションを実行します。

古い二つの手順のメソッドは、willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:とwillAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:メソッドの一つまたは両方をオーバーライドし、アニメーションの各手順の前に設定します。

これらの手法はどちらか一つのみ選択し、その手法に関連付けられたメソッドのみをオーバーライドする必要があります。

両方の手法のメソッドをオーバーライドした場合、システムはデフォルトで一つの手順の回転メソッドを使用します。



参考文献

UIViewController Class Reference

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る






Bose QuietComfort 20
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
08 | 2017/09 | 10
Sun Mon Tue Wed Thu Fri Sat
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

Bose QuietComfort 20
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR