0

我有这样的协议:

#import <Foundation/Foundation.h>

@protocol StoreDisplayerDelegate <NSObject>

-(void) changeActionForObjectWithId:(NSString *)objectID ;

@end

我有一个符合先例协议的callassStoreDisplayerDelegate

@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. 是:当对象是另一个对象的委托时,委托实现的方法是否仅由另一个对象调用(女巫有参考)?我的意思是,例如,在我显示的代码中,应该是changeActionForObjectWithId:downLoad 管理器刚刚调用的方法,还是我可以像这样在我的类的内部使用它:

  1. 我在做什么清洁或使用委托模式的糟糕设计?

我希望这很清楚。

4

4 回答 4

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) 之外的任何其他地方调用它们。

于 2013-05-21T14:50:52.037 回答
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”(例如,因为重构后不再需要委托),代码将继续工作.

于 2013-05-21T14:44:10.203 回答
0

委托是允许对象执行某些操作的协议。

在您的示例中:

@interface ShelfVC : UIViewController : <StoreDisplayerDelegate>

这告诉编译器 UIViewController 将在 StoreDisplayerDelegate 协议中实现一些方法。适用于 StoreDisplayerDelegate 的对象的行为方式取决于委托方法中的协议。

于 2013-05-21T14:46:11.553 回答
0

你对代表和协议有点困惑。委托是使用协议的设计模式。协议仅定义期望由另一个(非特定)类实现的方法和属性。从哪里访问这些方法/属性并不重要。

于 2013-05-21T14:46:18.727 回答