目标C:我们什么时候需要创建一个新的委托协议?

时间:2011-04-15 02:55:17

标签: objective-c delegates protocols

我正在浏览一些代码示例,并遇到了这个具有以下类的应用程序

1)FaceView类 - 绘制一个面部和一个可定制的微笑 2)HappinessViewContoller类 - 根据界面中滑块的输入设置面部中的笑脸。

该程序实际上在FaceView.h类中实现了一个委托协议,如下所示

#import <UIKit/UIKit.h>

@class FaceView;

@protocol FaceViewDelegate
- (float)smileForFaceView:(FaceView *)requestor;  // -1.0 (frown) to 1.0 (smile)
@end

@interface FaceView : UIView {
    id <FaceViewDelegate> delegate;
}

@property (assign) id <FaceViewDelegate> delegate;

@end

并且HappinessViewController声明它正在使用FaceViewDelegate

#import <UIKit/UIKit.h>
#import "FaceView.h"

@interface HappinessViewController : UIViewController <FaceViewDelegate>
{
    int happiness; // 0 to 100
    UISlider *slider;
    FaceView *faceView;
}

@property int happiness;

@property (retain) IBOutlet UISlider *slider;
@property (retain) IBOutlet FaceView *faceView;

- (IBAction)happinessChanged:(UISlider *)sender;

@end

我对为什么在这种情况下需要委托协议感到有点困惑。我可以设置方法“ - (float)smileForFaceView:(FaceView *)请求者;”直接在HappinessViewController中没有声明faceView的委托?

谢谢!

Zhen Hoe

1 个答案:

答案 0 :(得分:1)

从不必需为委托创建协议,但如果需要委托实现的方法,则可以更容易地确保兼容性。在这种情况下,当设置委托时,FaceView对象可以使用[newDelegate conformsToProtocol:@protocol(FaceViewDelegate)]来确保委托实现任何所需的方法。如果他们决定添加更多必需的方法,他们将不必更改他们的代码,因为委托必须实现所有必需的方法来符合。

如果您没有任何必需的方法,那么这不是有益的,因为您不能将它用于类型检查。但是,如果您正在编写库代码,那么您仍然应该使用它,因为您可以将所有可能的委托方法放在那里并将其用作参考。