使用协议接收消息?

时间:2013-01-06 18:09:43

标签: ios protocols

我目前正在学习Obj-C,更具体地说是协议。我需要在这里为我的问题编制一个场景才有意义。

第一个例子(带代表)。

  1. 我是一个UIView子类,它要求显示来自它控制器的信息(或者说应该如何显示信息)。我宣布一个协议并创建一个委托引用对象(或其他任何名称):

    @property (nonatomic, weak) id <protocolName> dataSource;
    
  2. 我的控制器符合此协议并实现所需的方法。

  3. View向Controller发送消息,Controller回答,一切正常。
  4. 据我所知,委派通过协议,我相信我理解它。

    但我们考虑另一种情况。

    1. 我是一个简单的基于关卡的游戏的大脑。我说何时显示菜单或何时开始玩游戏关卡。 但我需要知道某个级别何时完成。
    2. 这意味着该类需要准备好接收来自实现协议的任何人的消息,例如来自负责当前级别的另一个类。 现在这是我不理解的。协议应该如何以及在何处/如何实现它?

      如果我的问题仍然没有意义,请告诉我。谢谢!

2 个答案:

答案 0 :(得分:1)

Delegate是一种在实体之间发送消息的一对一关系方法。 如果您希望从不同的班级收到相同的讯息,可以使用{1}这是一对多的关系。

查看NSNotification类,尤其是NSNotificationCenter方法(用于发送消息)和postNotification方法(在收到通知时使用)

编辑: 这是委托的示例代码。

让我们以您的游戏级别为例。您有addObserver班级和LevelManager班级。如果您希望在FirstLevel结束时注意LevelManager,则必须在FirstLevel类中声明协议

FirstLevel

然后在FirstLevel.m中的某个位置,在级别结束时调用您的协议方法

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

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

下一步是将您的协议实施到LevelManager:

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

然后,设置// LevelManager.h @interface LevelManager : NSObject <SomeProtocol> @property (strong, nonatomic) FirstLevel *firstLevel; @end 并实施协议方法

firstLevel.delegate

答案 1 :(得分:0)

你仍然可以和代表团一起去:

让级别成为具有id<LevelDelegate>

类型委托的对象
@protocol LevelDelegate <NSObject>
-(void)completedLevel:(Level *)level;
@end

BrainController符合LevelDelegate并创建所有级别。对于每个级别,它将自己设置为委托。

如果某个级别识别出它已完成,则会调用[self.delegate completedLevel:self];

BrainController得到通知并做必要的事情。