我正在浏览一些代码示例,并遇到了这个具有以下类的应用程序
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
答案 0 :(得分:1)
从不必需为委托创建协议,但如果需要委托实现的方法,则可以更容易地确保兼容性。在这种情况下,当设置委托时,FaceView对象可以使用[newDelegate conformsToProtocol:@protocol(FaceViewDelegate)]
来确保委托实现任何所需的方法。如果他们决定添加更多必需的方法,他们将不必更改他们的代码,因为委托必须实现所有必需的方法来符合。
如果您没有任何必需的方法,那么这不是有益的,因为您不能将它用于类型检查。但是,如果您正在编写库代码,那么您仍然应该使用它,因为您可以将所有可能的委托方法放在那里并将其用作参考。