Objective-Cで「プロトコル」という概念があるかと思いますが、何故プロトコルがあるのかが良く見えませんでした。
「プロトコル」の概念について、記事がありましたのでご紹介します。
http://journal.mycom.co.jp/column/objc/009/index.html
http://journal.mycom.co.jp/column/objc/010/index.html
「プロトコル」を知るにはプロトコルではない「非公式プロトコル」の概念を知るとわかりやすいようです。
「プロトコル」は、定義されたメソッドの集合でかつ当該メソッドの実装を義務づけ、コンパイラでメソッドの実装をチェックするもののようです。
一方「非公式プロトコル」は、メソッドは定義するものの実装は任意ということでデリゲートして外部依頼のために定義されるようです。むしろこちらの方が良く使われるようです。
2010年5月9日日曜日
2010年4月25日日曜日
ViewController基本概念
ViewControllerは、様々なビューをコントロールするためiPhone開発における以下の重要な役割を持ちます。
- 画面が小さく、複数の画面に分散させる
- 複数の画面を適切なタイミングで表示/非表示させる
そのため、この概念について予め把握しておく必要があります。
◆ViewControllerの種類
- カスタムViewController:画面のタイプ毎にデータの型を変換(マーシャリング)し、表示を個別に管理するViewコントローラを作成する必要がある。
- コンテナViewController : 他のViewControllerを管理する。Navigation ControllerとTabBarControllerが該当する。システムが提供するものをそのまま使用する。
- モーダルViewController : コンテナViewControllerと異なり、ユーザがView間の関係を定義する。あるViewControllerから表示される補助的なViewControllerで、呼び出されたあと呼び出したViewControllerに値を返す。
◆カスタムViewControllerの作り方
- UIViewControllerから直接サブクラスを作成する。
- 直接コントロールするビューに対応するデータ等のインスタンス変数を宣言する。
- やりとりが必要なビューオブジェクトを指すインスタンス変数を宣言する(アウトレット)<... どうも最近ではプロパティとして宣言するようです>。
- 追加の動作に必要なメソッドを追加する。
- 他から受けるアクションに必要なメソッドを追加する(アクション)
----------------------------------------------------------------------------------
#import < UIKit/UIKit.h >
@interface button_FunViewController : UIViewController {
UILabel *statusText ;
}
@property (nonatomic, retain) IBOutlet UILabel *statusText ;
- (IBAction) buttonPressed:(id)sender ;
@end
----------------------------------------------------------------------------------
- ビューの管理、インターフェイスの向きの管理、メモリ不足の警告等が含まれる。
- ビューの管理では、一画面分のコンテンツを管理したり表示するための基本ロジックを提供する。
- 一連のビューをプログラムの中で作成したり、nibファイルからロードしたりするためのワークフローを提供する。
- メモリ管理では、メモリ不足状態の間は、これらのビューをメモリから削除し、後で必要になったときに再構築する処理を行う。
- インターフェイスの向きの管理では、ユーザがデバイスを回転したときにインターフェイスの向きを変更する動作を提供する。
- モーダルビューの基本機能として、現在のコンテンツの手前にほかのビューを一時的に表示する動作を提供する。
- 必要に応じオーバライドして使用する。
Model-Controller-Viewコンセプト
iPhoneのライブラリは、MVC(Model-View-Controller)で構成する三層アプリケーション開発コンセプトに忠実に実装されているそうです。
- Model : データを保持するクラス
- View : ユーザが操作するウィンドウ等
- Controller: ModelとViewを結びつけ、ユーザのインプットをどう処理するか決定するアプリケーションロジック
- Model : Core DataやSQL Lite等のクラスででデータを保持します。ネットワークからのデータの取得やストア、ロジックとは別のデータ変換等もこちらと思ったほうがいいかもしれません。
- View : UIKit、GameKit, MapKitなどのCoCoa例やのクラスで表示したり、Mediaレイヤのグラフィスクやオーディオ再生等もこちらと考えた方がいいかもしれません。
- Controller : NSObjectクラス(ルートクラス)や、UIViewControllerのようなUIKitフレームワークから派生させたサブクラスで構成するのが一般的のようです。
あとは、MVC間をコミュニケートする「プロトコル」も認識しておく必要がありそうです。
2010年4月22日木曜日
アクションメソッドとアウトレットとアプリケーションデリゲート
アクションメソッドとアプリケーションデリゲートの違いがわかっていないのでここで整理します。
■アクションメソッド:
呼び出し側のイベントにより、当該オブジェクトのインスタンスを呼び出すために、当該インスタンスを(IBAction)で識別、Interface Builderに明示し、InterfaceBuilderのユーザインタフェースに表示されるため、インスタンスと呼び出し側オビジェクとをリンクします。ここのインスタンスで取得されるsenderは、呼び出し側のオブジェクトそのものとなり、当該オブジェクトのメソッドも利用可能となります。
AppDelegte.h のクラス宣言でメソッドプロトタイプ宣言の返り値に(IBAction) を指定します。
----------------------------------------------------------------------------------------
@interface xxxAppDelegate : NSObject <UIApplicationDelegate>{
// インスタンス変数宣言
}
// メソッドプロトタイプ宣言
- (IBAction) action : (UITextField *) sender ;
// forEvent : (UIEvent *) event を書くとさらに時刻やタッチされた座標等の追加
// 情報を得ることができます。
@end
------------------------------------------------------------------------------------------
これにより、Interface Builder上でアクションメソッドとして表示されます。
さらにInterface Builderにより、ボタン等のクラスの動作(Event)と
結びつけられることで、イベント発生時に呼び出されます。
呼び出された後の動作は、AppDelegate.mに記述します。
<関連付けクラス(Event) ⇒ アクションメッソドが呼び出される。>
■アウトレット
アウトレットは、メソッドプロトタイプ宣言ではなく、インスタンス変数宣言に記載します。
----------------------------------------------------------------------------------------
@interface xxxAppDelegate : NSObject <UIApplicationDelegate>{
// インスタンス変数宣言
}
// メソッドプロトタイプ宣言
@end
------------------------------------------------------------------------------------------
これにより、Interface BuilderのOutlet(コンセントの意)が現れ、ユーザインタフェース等の
クラス(インスタンス)そのものと関連づけます。
この関連付けにより、xxxAPPDelegate.m に当該インスタンスとそのメソッドを直接呼ぶことができるようです。
例:[ webView loadRequest : urlReq ];
<アウトレット宣言クラス ⇒ 関連付けクラスのメソッド等を呼び出すことができる>
■アプリケーションデリゲート
アプリケーションデリゲートは、アウトレットの一種であり、UIApplicationがデフォルトで保有するアウトレットとして、deligateが宣言され、Interface Builderから見ることができます。
<UIApplicationのアウトレット(deligate) → 関連付けクラスに記載されたアウトレット指定のメッソドを記述すればUIApplicationから必要時に呼び出だされる>
やっと理解できました。ほっ。
■アクションメソッド:
呼び出し側のイベントにより、当該オブジェクトのインスタンスを呼び出すために、当該インスタンスを(IBAction)で識別、Interface Builderに明示し、InterfaceBuilderのユーザインタフェースに表示されるため、インスタンスと呼び出し側オビジェクとをリンクします。ここのインスタンスで取得されるsenderは、呼び出し側のオブジェクトそのものとなり、当該オブジェクトのメソッドも利用可能となります。
AppDelegte.h のクラス宣言でメソッドプロトタイプ宣言の返り値に(IBAction) を指定します。
----------------------------------------------------------------------------------------
@interface xxxAppDelegate : NSObject <UIApplicationDelegate>
// インスタンス変数宣言
}
// メソッドプロトタイプ宣言
- (IBAction) action : (UITextField *) sender ;
// forEvent : (UIEvent *) event を書くとさらに時刻やタッチされた座標等の追加
// 情報を得ることができます。
@end
------------------------------------------------------------------------------------------
これにより、Interface Builder上でアクションメソッドとして表示されます。
さらにInterface Builderにより、ボタン等のクラスの動作(Event)と
結びつけられることで、イベント発生時に呼び出されます。
呼び出された後の動作は、AppDelegate.mに記述します。
<関連付けクラス(Event) ⇒ アクションメッソドが呼び出される。>
■アウトレット
アウトレットは、メソッドプロトタイプ宣言ではなく、インスタンス変数宣言に記載します。
----------------------------------------------------------------------------------------
@interface xxxAppDelegate : NSObject <UIApplicationDelegate>{
// インスタンス変数宣言
}
// メソッドプロトタイプ宣言
@property ( nonatomic, retain) IBOutlet UIWebView* WebView;
@end
------------------------------------------------------------------------------------------
これにより、Interface BuilderのOutlet(コンセントの意)が現れ、ユーザインタフェース等の
クラス(インスタンス)そのものと関連づけます。
この関連付けにより、xxxAPPDelegate.m に当該インスタンスとそのメソッドを直接呼ぶことができるようです。
例:[ webView loadRequest : urlReq ];
<アウトレット宣言クラス ⇒ 関連付けクラスのメソッド等を呼び出すことができる>
■アプリケーションデリゲート
アプリケーションデリゲートは、アウトレットの一種であり、UIApplicationがデフォルトで保有するアウトレットとして、deligateが宣言され、Interface Builderから見ることができます。
<UIApplicationのアウトレット(deligate) → 関連付けクラスに記載されたアウトレット指定のメッソドを記述すればUIApplicationから必要時に呼び出だされる>
やっと理解できました。ほっ。
アウトレットとは
予めInterface Builderで生成されているインスタンス(ここではUIWebView)をAPPDeligateで宣言した変数に組み込むには、IBOutletという形で明示してヘッダファイルで型を宣言するようです。
そうすると、ソースファイル上で宣言する必要はなく、AppDeligateのOutlet変数をInterface BuilderでWindow上に貼付けたWebViewへドラックすることで関連付け組み込むことができるそうです。
@interface Web_blowserAppDelegate : NSObject {
IBOutlet UIWebView* webView;
UIWindow *window;
}
そうすると、ソースファイル上で宣言する必要はなく、AppDeligateのOutlet変数をInterface BuilderでWindow上に貼付けたWebViewへドラックすることで関連付け組み込むことができるそうです。
@interface Web_blowserAppDelegate : NSObject {
IBOutlet UIWebView* webView;
UIWindow *window;
}
ビューとサブビュー
iPhoneアプリの開発のためには、その用語を理解する必要があります。
今日出会った用語は以下のものです。
◆ウインドウ
iPhoneアプリケーションは、通常、
◆ビュー
コンテンツの表示とイベント処理のほかに、ビューは、1つ以上のサブビューを管理できます。
◆サブビュー
サブビューとは、元のビューオブジェクト(親ビューまたはスーパービューと呼ばれる)のフレーム内に埋め込まれたビューオブ ジェクトのことです。
ビューは、ビュー階層と呼ばれる階層構造になっており、階層には任意の数のビューを含めることができます。また、サブビューにさらにサブビューを追加して、ビューを何階層にもネストさせることができます。各サブビューは、その親ビューの手前に表示されるので、画面への表 示はビュー階層内のビューの構成によって決まります。また、この構成によって、ビューがイベントや変更にどのように対応するかも決まります。各親ビュー は、その直下のサブビューの管理を担当し、必要に応じてサブビューの位置やサイズを調整したり、サブビューで処理できないイベントに応答したりします。
◆ラベル
文字列表示のためのビュー
◆表示ビュー
情報を表示するだけのビュー。このような動作をするUIKitクラスには、
今日出会った用語は以下のものです。
◆ウインドウ
iPhoneアプリケーションは、通常、
UIWindowクラスのインスタンスで表わされるウインドウを1つだけ持っていま す。アプリケーションは、起動時にこのウインドウを作成し(または、nibファイルからウインドウをロードし)、1つ以上のビューをそこに追加して表示し ます。◆ビュー
UIViewクラスのインスタンスであるビューは、画面上の矩形領域を定義します。 iPhoneアプリケーションでは、ユーザインターフェイスの表示と、そのインターフェイスを対象とした操作への応答の両面において、ビューは中心的な役割を果たします。コンテンツの表示とイベント処理のほかに、ビューは、1つ以上のサブビューを管理できます。
◆サブビュー
サブビューとは、元のビューオブジェクト(親ビューまたはスーパービューと呼ばれる)のフレーム内に埋め込まれたビューオブ ジェクトのことです。
ビューは、ビュー階層と呼ばれる階層構造になっており、階層には任意の数のビューを含めることができます。また、サブビューにさらにサブビューを追加して、ビューを何階層にもネストさせることができます。各サブビューは、その親ビューの手前に表示されるので、画面への表 示はビュー階層内のビューの構成によって決まります。また、この構成によって、ビューがイベントや変更にどのように対応するかも決まります。各親ビュー は、その直下のサブビューの管理を担当し、必要に応じてサブビューの位置やサイズを調整したり、サブビューで処理できないイベントに応答したりします。
◆ラベル
文字列表示のためのビュー
◆表示ビュー
情報を表示するだけのビュー。このような動作をするUIKitクラスには、
UIImageView、UILabel、UIProgressView、およびUIActivityIndicatorViewなどがあります。
登録:
投稿 (Atom)