web-dev-qa-db-ja.com

デリゲートは正確にxcode iosプロジェクトで何をしますか?

IPhoneアプリの開発について学んでいるところですが、デリゲートの実際の意味を理解するのに苦労していますか?それが何をするか、それがどれほど重要であるかを例を挙げて誰かが私に言うことができますか?助けてくれてありがとう!

28
Newbie

これは概念的に理解することが重要な概念であるため、技術的な詳細よりも前にそれについてどのように考えるかを頭に入れることが重要です。簡単に言えば、デリゲートはコールバックです。

デリゲートを使用する2つの主なシナリオ:

  1. クラスまたはコントロールは、作業方法(データの取得など)の詳細を抽象化したいと考えています。
  2. 他のユーザーがコードをパイプラインにフックできるようにします。

例:UITableView-テーブルビューは、セルのリストをレンダリングする方法を知っている単なるコントロールです。レンダリングやスクロールなどの重労働をすべて処理しますが、データのロード方法がわかりません。そのため、特定の行などのセルデータを取得するメソッドを持つデータソースデリゲートを実装します。これにより、作業が簡単になります。コントロールを使用して、データの詳細をプラグインするだけです。 UITableViewはあなたのためにすべてを行います...いくつかの特定の質問に答えるだけです。デリゲートはこれらのいくつかの特定の質問に答えます。

テキストコントロール-ビューにテキストコントロールを追加して出来上がり!入力できます。しかし、ユーザーが入力を開始したとき、または入力が完了したときに何かしたい場合はどうでしょうか。さて、テキストコントロールは、テキストコントロールの実行パイプラインにフックできるメソッドを持つデリゲートを提供します。これにより、テキストコントロールですべてを実行でき、必要な場所にコードを挿入できます。多くの場合、コードを挿入して、何かが許可されているかどうかを判断する方法があります。コントロールがコールバックして質問します。xを実行できますか?コードを挿入して、動作に影響を与えることができます。

コントロールまたはクラスを作成している場合は、独自のプロトコル、データソースデリゲートなどを作成できるため、コントロールは宣伝されていることを行うことに集中できます。たとえば、タスクコントロールを作成したいとします。あなたは出来る:

まず、契約を作成します。ねえ、私のコントロールにデータを提供するつもりなら、これらは私があなたに尋ねるつもりの質問です。そこから取得します...この場合、タスクの数を聞いて、行番号を指定してタスクを教えてもらいます。

@protocol XXTaskBoardDelegate <NSObject>
-(NSInteger*)getTaskCount;
-(XXTask*)getTaskForRow:(NSInteger*)rowNumber;
@end

コントロールまたはクラスで、コンシューマーに、コントロールが尋ねる質問に答えるデリゲートデータソースクラスを提供する方法を提供します。この時点で、コントロールは純粋なコントロールです。データの取得方法については何も知りません。コントラクト/プロトコルを実装するオブジェクト(id)を求めています。 id

@implementation XXTaskBoard
- (void)setDelegate:(id<XXTaskBoardDelegate>)newDelegate
{
    // the control stores the delegate so it can callback and ask you questions.
}

次に、デリゲートクラスのヘッダー宣言でその正式なプロトコルを実装し、実装mファイルでコードを提供します。

@interface AppController : NSObject<XXTaskBoardDelegate> 
{
    //...
}

次に、実装でそれを実装します

@implementation AppController
- (NSInteger*)getTaskCount
{
    return [model queryTaskCount];
}

- (XXTask*)getTaskForRow:(NSInteger*)rowNumber
{
    return [[model tasks] getItem:(NSInteger*)rowNumber];
}
41
bryanmac

デリゲートは、別のクラスがメッセージを渡すことができるオブジェクトです。実際には、デリゲートクラスはデリゲートプロトコルに準拠する必要があります。

たとえば、テーブルビューコントローラのサブクラスを取得します。これはテーブルビューのデリゲートです。まず、次のようにして、それがテーブルビューデリゲートであることを定義します。

MyTableViewController : UITableViewController <UITableViewDelegate>

これは、クラスMyTableViewControllerUITableViewControllerのサブクラスであり、UITableViewDelegateプロトコルに準拠していることを示しています。

設定[tableView setDelegate:self](またはIBでそれを定義する)は、テーブルビューがメッセージを送信するために、selfオブジェクトをテーブルビューに渡します。

それが送信する主なメッセージは、ユーザーがテーブルビューセルを押したことをクラスに通知するdidSelectRowAtIndexPathメッセージです。

したがって、クリックイベントを受け取るオブジェクト(テーブルビュー)は、セルがクリックされたというメッセージをデリゲートオブジェクト(この場合はMyTableViewControllerオブジェクト)に渡します。

デリゲートプロトコルが存在するため、デリゲートオブジェクトにメッセージを処理するために必要なメソッドがあることを確認できます。デリゲートプロトコルのメソッドは@optionalまたは強制。オプションのメソッドを定義する必要はありません。 MyTableViewControllerクラスでは、メソッドdidSelectRowAtIndexPathはオプションです-必須ではありません。テーブルビューがメソッドを見つけられない場合、それは呼び出されません。

ただし、cellForRowAtIndexPathは必要であり、それがないとアプリはコンパイルできません。

これがお役に立てば幸いです。さらに情報が必要な場合はお知らせください。

10
Thomas Clayson

デリゲートは、何かからコールバックを取得するための単なる方法です。デリゲート(プロトコルに準拠するオブジェクトへのポインタ)を何かに渡し、新しいデータがある場合、またはデリゲートでメソッドが呼び出されるイベントが発生した場合。

たとえば、アプリがバックグラウンドに置かれたり、アプリが終了しようとしているようなイベントが発生すると、UIApplicationオブジェクトはアプリケーションデリゲートを呼び出して通知します。 CLLocationManagerに新しいGPS位置がある場合、デリゲートを呼び出して新しい位置を渡します。 UITableViewsはデリゲートを呼び出し、UITableViewCellsを取得してテーブルに表示します。 iOSではデリゲートの多くの用途があります。

3
progrmr