Цель C: когда нам нужно создать новый протокол делегата? - PullRequest
1 голос
/ 15 апреля 2011

Я просматривал несколько примеров кода и наткнулся на это приложение, которое имеет следующие классы

1) FaceView Class - рисует лицо и настраиваемую улыбку 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 *) requestor;" непосредственно в HappinessViewController без объявления делегата для faceView?

Спасибо!

Жень Мотыга

1 Ответ

1 голос
/ 15 апреля 2011

Никогда не требуется для создания протокола для делегатов, но это облегчает обеспечение совместимости, если существуют методы, которые делегат должен реализовать. В этом случае, когда делегат установлен, объект FaceView может использовать [newDelegate conformsToProtocol:@protocol(FaceViewDelegate)], чтобы убедиться, что делегат реализует любые необходимые методы. Если они решат добавить больше обязательных методов, им не придется менять свой код, потому что делегат должен реализовать все необходимые методы для соответствия.

Если у вас нет необходимых методов, тогда это не так выгодно, так как вы не можете использовать его для проверки типов. Однако, если вы пишете библиотечный код, вы все равно должны его использовать, потому что вы можете поместить туда все свои возможные методы делегата и использовать его в качестве ссылки.

...