2010-12-06 3 views
1

Я в замешательстве - я не понимаю, для чего предназначен делегат?Дилемма объявления делегата

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

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

//... 

@end 

Что такое <UIScrollViewDelegate> для?

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

ответ

12

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

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

Вы можете соответствовать своему классу к нескольким протоколам, если вам нравится:

@implementation MyClass : UIViewController <SomeProtocol, SomeOtherProtocol> 

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

Вот пример:

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 
+4

Чтобы прояснить ответ Якоба ... Причина, по которой вы бы использовали делегат, заключалась в том, чтобы назначить класс для обработки конкретных задач, на которые полагается объект UIScrollView, чтобы выполнять свою работу должным образом. В условиях мирян вы могли подумать об этом как о личном помощнике. Босс слишком занят, чтобы заботиться о том, как устроен обед, поэтому у него есть делегат (его секретарь или такой), который он призывает заказать обед для своей команды на важной встрече. Он просто говорит: «Эй, Джуди, нам нужен обед на 5 человек, вот что они хотят», Джуди затем берет эту информацию и делает все, что нужно сделать, чтобы получить обед. – 2010-12-06 06:39:45

2

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