iPhoneがイベントを処理する方法のアウトレットの概念を理解するのに問題があります。ヘルプ!代表団も私を混乱させます。誰かが説明してくれませんか?
2 に答える
アウトレット(Interface Builder 内) は、実行時に読み込まれるときにデザイナー内のオブジェクトが割り当てられるクラスのメンバー変数です。IBOutlet
マクロ (空の ) は、それ#define
をデザイナーに表示するアウトレットとして認識するように Interface Builder に通知します。
たとえば、ボタンをドラッグしてaButton
アウトレット (interface .h ファイルで定義) に接続すると、実行時に NIB ファイルをロードすると、NIBによってインスタンス化されたaButton
ポインタが割り当てられます。UIButton
@interface MyViewController : UIViewController {
UIButton *aButton;
}
@property(nonatomic, retain) IBOutlet UIButton *aButton;
@end
次に、実装で:
@implementation MyViewController
@synthesize aButton; // Generate -aButton and -setAButton: messages
-(void)viewDidAppear {
[aButton setText:@"Do Not Push. No, seriously!"];
}
@end
これにより、実行時に GUI オブジェクトをインスタンス化して割り当てるコードを記述する必要がなくなります。
Delegatesに関しては、別のオブジェクト (通常は、テーブル ビューなどの一般化された API クラス) によって使用されるイベント受信オブジェクトです。それらについて本質的に特別なことは何もありません。以上がデザインパターンです。デリゲート クラスは、次のような予期されるメッセージのいくつかを定義する場合があります。
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
...そして API オブジェクトは、イベントを通知したいときにデリゲートでこのメッセージを呼び出します。例えば:
-(void)update:(double)time {
if (completed) {
[delegate process:self didComplete:totalTimeTaken];
}
}
そしてデリゲートはメッセージを定義します:
-(void)process:(Process *)process didComplete:(double)totalTimeTaken {
NSString *log = [NSString stringWithFormat:@"Process completed in %2.2f seconds.", totalTimeTaken];
NSLog(log);
}
そのような使用法は次のとおりです。
Process *proc = [Process new];
[proc setDelegate:taskLogger];
[proc performTask:someTask];
// Output:
// "Process completed in 21.23 seconds."
デリゲートは、別のオブジェクトがメッセージを転送できるオブジェクトです。つまり、お母さんに部屋を掃除するように言われ、それを弟に質入れしたときのようなものです。あなたの弟は仕事のやり方を知っているので(あなたは怠け者で学ぶことができなかったので)、あなたのためにそれをやってくれます。