我目前正在学习Obj-C,更具体地说是协议。我需要在这里为我的问题编制一个场景才有意义。
第一个例子(带代表)。
我是一个UIView子类,它要求显示来自它控制器的信息(或者说应该如何显示信息)。我宣布一个协议并创建一个委托引用对象(或其他任何名称):
@property (nonatomic, weak) id <protocolName> dataSource;
我的控制器符合此协议并实现所需的方法。
据我所知,委派通过协议,我相信我理解它。
但我们考虑另一种情况。
这意味着该类需要准备好接收来自实现协议的任何人的消息,例如来自负责当前级别的另一个类。 现在这是我不理解的。协议应该如何以及在何处/如何实现它?
如果我的问题仍然没有意义,请告诉我。谢谢!
答案 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得到通知并做必要的事情。