Заявление делегата о дилемме - PullRequest
1 голос
/ 06 декабря 2010

Я в замешательстве - я не могу понять, для чего делегат?

Делегат приложения, который создается по умолчанию, понятен, но в некоторых случаях я видел нечто подобное:

@interface MyClass : UIViewController <UIScrollViewDelegate> {
    UIScrollView *scrollView;
    UIPageControl *pageControl;
    NSMutableArray *viewControllers;
    BOOL pageControlUsed;
}

//...

@end

Для чего <UIScrollViewDelegate>?

Как это работает и почему это используется?

Ответы [ 2 ]

12 голосов
/ 06 декабря 2010

<UIScrollViewDelegate> говорит, что класс соответствует протоколу UIScrollViewDelegate .

Что на самом деле означает, чтоКласс должен реализовывать все необходимые методы, определенные в протоколе UIScrollViewDelegate.Все просто.

Вы можете согласовать свой класс с несколькими протоколами, если хотите:

@implementation MyClass : UIViewController <SomeProtocol, SomeOtherProtocol>

Цель соответствия класса протоколу состоит в том, чтобы: а) объявить тип как соответствующийпротокола, так что теперь вы можете классифицировать этот тип в id <SomeProtocol>, что лучше для объектов делегатов, к которым могут принадлежать объекты этого класса, и б) Он говорит компилятору не предупреждать вас, что реализованные методы не объявлены вфайл заголовка, поскольку ваш класс соответствует протоколу.

Вот пример:

Printable.h

@protocol Printable

 - (void) print:(Printer *) printer;

@end

Document.h

#import "Printable.h"
@interface Document : NSObject <Printable> {
   //ivars omitted for brevity, there are sure to be many of these :)
}
@end

Document.m

@implementation Document

   //probably tons of code here..

#pragma mark Printable methods

   - (void) print: (Printer *) printer {
       //do awesome print job stuff here...
   }

@end

Вы можете , а затем иметь несколько объектов, соответствующих протоколу Printable, которые затем можно использовать в качестве переменной экземпляра, скажем, в PrintJob объект:

@interface PrintJob : NSObject {
   id <Printable> target;
   Printer *printer;
}

@property (nonatomic, retain) id <Printable> target;

- (id) initWithPrinter:(Printer *) print;
- (void) start;

@end

@implementation PrintJob 

@synthesize target; 

- (id) initWithPrinter:(Printer *) print andTarget:(id<Printable>) targ {
   if((self = [super init])) {
      printer = print;
      self.target = targ;
   }
   return self;
}

- (void) start {
   [target print:printer]; //invoke print on the target, which we know conforms to Printable
}

- (void) dealloc {
   [target release];
   [super dealloc];
}
@end
2 голосов
/ 06 декабря 2010

Я думаю, вам нужно понять шаблон делегата .Это базовый шаблон, используемый приложениями для iphone / ipad, и если вы его не поймете, вы не уйдете далеко.Ссылка на википедию, которую я только что использовал, обрисовывает в общих чертах образец и дает примеры его использования, включая Цель C. Это было бы хорошим местом для начала.Также взгляните на учебное руководство по от Apple , которое характерно для iPhone, а также обсуждает шаблон делегата.

...