我有这样的协议:
#import <Foundation/Foundation.h>
@protocol StoreDisplayerDelegate <NSObject>
-(void) changeActionForObjectWithId:(NSString *)objectID ;
@end
我有一个符合先前协议StoreDisplayerDelegate
@interface ShelfVC : UIViewController :<StoreDisplayerDelegate>
....
@implementation ShelfVC
...
- (void)viewDidLoad {
...
DownloadManager *manager = [DownloadManager sharedInstance];
[manager setStoreDisplayerDelegate:self];
....
}
#pragma mark StoreDisplayerDelegate methods
-(void) changeActionForObjectWithId:(NSString *)objectID {
......
}
@end
在我的代码中(在同一个类中)有时我会调用委托方法来执行某些操作,例如:
- (void)anOtherMethod{
[self changeActionForObjectWithId:nil];
}
我的问题
1. is:当object是另一个对象的委托时,委托实现的方法是否只由另一个对象调用(对它有引用)?我的意思是,例如在我已经显示的代码中,应该由downLoad管理器调用的方法changeActionForObjectWithId:
,或者我可以在我的类的内容中使用它,如下所示:
我希望很清楚。
答案 0 :(得分:1)
您的委托方法名称听起来就像一个命令。
-(void)changeActionForObjectWithId:(NSString *)objectID;
听起来你的StoreDisplayer告诉代表做某事。您也很想从ViewController中调用该方法,这一事实证实了这一点。
这不是委托模式。委托模式用于类以通知委托变更,或向代表询问某些信息。委托类(StoreDisplayer?)不应该知道任何特定委托的作用,因此它不应该能够直接给出特定的命令。只委托通用行为。
委托方法看起来更像这些例子:
-(BOOL)actionShouldChangeForStoreDisplayer:(StoreDisplayer*)storeDisplayer;
-(void)actionWillChangeForStoreDisplayer:(StoreDisplayer*)storeDisplayer objectId:(NSString *)objectId;
-(void)actionDidChangeForStoreDisplayer:(StoreDisplayer*)storeDisplayer objectId:(NSString *)objectId;
我不是说那些是你需要的,但他们应该给你这个想法。
当你的委托方法看起来像这样时,显然你不会想要从正在进行委托的类(StoreDisplayer)以外的任何东西中调用它们。
答案 1 :(得分:0)
在我的项目中,我有不同目的的相同情况。在我看来,委托方法必须只由另一个对象调用,因为它是它的方法。
如果您需要在委托方法中执行某些操作,最好创建另一个私有方法来执行操作并从委托方法中调用它。
一些例子。而不是这样做:
- (void)anOtherMethod {
[self changeActionForObjectWithId:nil];
}
- (void)changeActionForObjectWithId:(NSString *)objectID {
< some actions >
}
我这样做:
- (void)privateMethod{
< some actions >
}
- (void)anOtherMethod {
[self privateMethod];
}
- (void)changeActionForObjectWithId:(NSString *)objectID {
[self privateMethod];
}
为什么这样?因为您必须考虑委托方法到基础对象的“扩展”:如果删除“changeActionForObjectWithId”(例如,在重构后您不再需要委托)代码将继续工作
答案 2 :(得分:0)
委托是一种允许对象执行某些操作的协议。
在你的例子中:
@interface ShelfVC : UIViewController : <StoreDisplayerDelegate>
这告诉编译器UIViewController将在StoreDisplayerDelegate协议中实现一些方法。适用于StoreDisplayerDelegate的对象如何运行将取决于委托方法中的协议。
答案 3 :(得分:0)
你对代表和协议有点困惑。委托是一种使用协议的设计模式。 协议仅定义预期由另一个(非特定)类实现的方法和属性。从哪里访问此方法/属性无关紧要。