Objective c 目标C:我们什么时候需要创建新的代理协议?

Objective c 目标C:我们什么时候需要创建新的代理协议?,objective-c,delegates,protocols,Objective C,Delegates,Protocols,我在浏览一些代码示例时遇到了这个应用程序,它有以下几个类 1) FaceView类-绘制一张脸和一个可自定义的微笑 2) HappinessViewController类-设置基于界面中滑块输入绘制的脸上的微笑 该程序实际上在FaceView.h类中实现了一个委托协议,如下所示 #import <UIKit/UIKit.h> @class FaceView; @protocol FaceViewDelegate - (float)smileForFaceView:(FaceVie

我在浏览一些代码示例时遇到了这个应用程序,它有以下几个类

1) FaceView类-绘制一张脸和一个可自定义的微笑 2) HappinessViewController类-设置基于界面中滑块输入绘制的脸上的微笑

该程序实际上在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
#导入
@类FaceView;
@协议FaceViewDelegate
-(float)smileForFaceView:(FaceView*)请求者;//-1.0(皱眉)到1.0(微笑)
@结束
@界面FaceView:UIView{
id代表;
}
@属性(分配)id委托;
@结束
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
#导入
#导入“FaceView.h”
@界面HappinesViewController:UIViewController
{
int happiness;//0到100
UISlider*滑块;
FaceView*FaceView;
}
@财产与幸福;
@属性(保留)IBUISLIDER*滑块;
@属性(保留)IBOutlet FaceView*FaceView;
-(iAction)快乐改变:(UISlider*)发送者;
@结束
我有点困惑,为什么在这个场景中需要委托协议。我可以直接在HappinesViewController中设置方法“-(float)smileForFaceView:(FaceView*)requestor;”,而不声明FaceView的委托吗

谢谢

Zhen Hoe

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

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

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

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