0

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

第一个例子(有一个代表)。

  1. 我是一个 UIView 子类,它请求从它的控制器显示信息(或者更确切地说应该如何显示信息)。我声明了一个协议并创建了一个委托引用对象(或其他任何名称):

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

  3. View 向 Controller 发送消息,Controller 应答,一切正常。

据我所知,这是通过协议授权,我相信我理解它。

但是让我们考虑另一种情况。

  1. 我是一个类,它是一个简单的基于级别的游戏的大脑。我说何时显示菜单或何时开始玩游戏关卡。但我需要知道一个关卡何时完成。

这意味着这个类需要准备好接收来自任何实现该协议的人的消息,例如来自负责当前级别的另一个类。现在这是我不明白的。协议应该是什么样子以及在哪里/如何实现它?

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

4

2 回答 2

1

委托是一种用于在实体之间发送消息的一对一关系方法。如果你想从不同的班级接收相同的消息,你可以使用NSNotification一对多的关系。

查看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

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

如果一个关卡认识到它已经完成,它会调用[self.delegate completedLevel:self];.

BrainController 得到通知并执行必要的操作。

于 2013-01-06T19:06:21.183 回答