0

Apple dev ドキュメント、私が持っている他の本、および stackoverflow などのリソースに、デリゲートに関する話題がたくさんあることを私は知っています。しかし、私はまだそれを取得していません。

私は最近、スタンフォード大学の CS193P Winter 2010 シリーズで Navigation View Controllers などに関する講義を見ました。その講義では、View Controller のスタック上でデータを転送する方法について説明していますが、これは簡単です。しかし、彼らは理想的にはデリゲート/プロトコルを使用してデータを「逆方向」に渡す (たとえば、詳細ビュー コントローラーからリスト ビュー コントローラーへ) と簡単に述べましたが、デモを行ったり、サンプル コードを投稿したりしませんでした。

この正確なシナリオのサンプルを読んで検索したので、デリゲート/プロトコルの使用に頭を悩ませることができますが、見つかりません。これが私が遊んでいる疑似コードです。データを「逆方向」に渡す必要がありますか?

myListController : UIViewController <SetDataInParent> {
 // when pushing detail controller onto stack,
 // set DetailController delegate = self
}

myDetailController : UIViewController {
//header file
@protocol SetDataInParent <NSObject>
- (void)willSetValue:(*NSString);
@end

@interface myDetailController {
id <SetDataInParent> delegate;
}
@end

// class/m file 
@implementation
@synthesize delegate;
- (void)willSetValue:(*NSString) {
// code here that would take argument
// from detail controller and set
// a value or text field to that
// argument in list controller
}
// send message to list controller class
- [delegate willSetValue:string];
@end
}
4

1 に答える 1

0

デリゲートは、1 つまたは複数のメッセージを送信する現在の目的以外の目的の C インスタンスです。指定した型 ( id <SetDataInParent) は、プロトコルに準拠する任意の Objective-C 型であることを示していSetDataInParentます (コードで定義されていませんが、別の場所で使用できます)。

「後方」に移動する場合、通常、2 つのオブジェクト間のデリゲート リンクは、子ビューの作成時に作成されます。したがって、リスト ビュー コントローラーが詳細ビュー コントローラーを作成する時点で、前者は後者のデリゲートを に設定する必要がありselfます。詳細ビュー コントローラーは、そのデリゲート ポインターを使用して、eg を介して直接、または ( . を介して)willSetValue:間接的に、リスト ビュー コントローラーにメッセージを送信できます。これを使用する場合は、最初にデリゲートを呼び出して、確実に失敗しないようにすることをお勧めします。オブジェクトがそのメッセージに応答しない場合、例外をスローします。performSelector:withObject:performSelector:withObject:respondsToSelector:

于 2010-12-16T17:19:34.897 に答える