0

私は現在、Obj-C、より具体的にはプロトコルを学んでいます。私の質問を理解するには、ここでシナリオを作成する必要があります。

最初の例 (デリゲートを使用)。

  1. 私は、コントローラーからの情報を表示するように要求する UIView サブクラスです (または、情報の表示方法)。プロトコルを宣言し、デリゲート参照オブジェクト (またはそれが呼ばれるもの) を作成します。

    @property (nonatomic, weak) id <protocolName> dataSource;
    
  2. 私のコントローラーはこのプロトコルに準拠しており、必要なメソッドを実装しています。

  3. ビューはコントローラーにメッセージを送信し、コントローラーは応答し、すべて問題ありません。

私が知る限り、これはプロトコルによる委任であり、私はそれを理解していると信じています。

しかし、別のシナリオを考えてみましょう。

  1. 私は単純なレベルベースのゲームの頭脳であるクラスです。メニューをいつ表示するか、またはゲームレベルのプレイをいつ開始するかを言います。しかし、レベルがいつ完了したかを知る必要があります。

つまり、このクラスは、現在のレベルを担当する別のクラスなど、プロトコルを実装する人からメッセージを受信する準備ができている必要があります。今、これは私が理解していないものです。プロトコルはどのように見えるべきで、どこで/どのように実装するのですか?

私の質問がまだ意味をなさない場合はお知らせください。ありがとう!

4

2 に答える 2

1

デリゲートは、エンティティ間でメッセージを送信するための 1 対 1 の関係メソッドです。異なるクラスから同じメッセージを受け取りたい場合NSNotificationは、1 対多の関係を使用できます。

NSNotificationCenterクラス、特にpostNotificationメソッド(メッセージを送信するため)とaddObserverメソッド(通知を受信したときに使用される)を見てください

編集: 委任のコード例を次に示します。

ゲームのレベルベースの例を見てみましょう。LevelManagerクラスとクラスがありFirstLevelます。LevelManager終了時に通知したい場合は、クラスFirstLevelでプロトコルを宣言する必要がありますFirstLevel

// FirstLevel.h
@protocol SomeProtocol <NSObject>
-(void)levelDidEnd;
@end

@interface FirstLevel : NSObject
@property (nonatomic, weak) id<SomeProtocol> delegate;
@end

次に、FirstLevel.m のどこかで、レベルが終了したときにプロトコル メソッドを呼び出します。

// FirstLevel.m
- (void)playGame {
    if ([player isDead]) {
        [delegate levelDidEnd];
    }
}

次のステップは、プロトコルを LevelManager に実装することです:

// LevelManager.h
@interface LevelManager : NSObject <SomeProtocol>
@property (strong, nonatomic) FirstLevel *firstLevel;
@end

そして、firstLevel.delegateプロトコルメソッドを設定して実装します

// LevelManager.h
- (void)viewDidLoad {
    firstLevel.delegate = self;
}

- (void) didLevelEnd {
    // do actions here like showing the menu
}
于 2013-01-06T18:23:57.210 に答える
0

あなたはまだ委任に行くことができます:

レベルをデリゲート型のオブジェクトにするid<LevelDelegate>

@protocol LevelDelegate <NSObject>
-(void)completedLevel:(Level *)level;
@end

BrainControllerLevelDelegateは、すべてのレベルに準拠して作成します。レベルごとに、それ自体をデリゲートとして設定します。

レベルが終了したことを認識すると、 を呼び出します[self.delegate completedLevel:self];

BrainController は情報を受け取り、必要なことを行います。

于 2013-01-06T19:06:21.183 に答える