Как использовать пользовательские делегаты в Objective-C - PullRequest
51 голосов
/ 14 марта 2009

Мне нужно знать об использовании методов делегата в Objective-C. Кто-нибудь может указать мне правильный источник?

Ответы [ 4 ]

128 голосов
/ 02 августа 2009

Вы захотите объявить протокол делегата для вашего класса. Пример протокола делегата и интерфейса для класса Foo может выглядеть следующим образом:

@class Foo;
@protocol FooDelegate <NSObject>
@optional
- (BOOL)foo:(Foo *)foo willDoSomethingAnimated:(BOOL)flag;
- (void)foo:(Foo *)foo didDoSomethingAnimated:(BOOL)flag;
@end

@interface Foo : NSObject {
     NSString *bar;
     id <FooDelegate> delegate;
}

@property (nonatomic, retain) NSString *bar;
@property (nonatomic, assign) id <FooDelegate> delegate;

- (void)someAction;

@end

Не забудьте синтезировать ваши свойства в @implementation.

Что этот код сделал, так это объявил протокол под названием FooDelegate; класс, соответствующий этому протоколу, будет объявлен как @interface SomeClass : SuperClass <FooDelegate> {}. Поскольку этот класс соответствует протоколу FooDelegate, теперь он получает возможность реализовывать методы в FooDelegate (чтобы требовать их реализации, используйте @required вместо @optional). Последний шаг - создание объекта Foo в классе, соответствующем FooDelegate, и для этого объекта Foo его свойство делегата должно быть установлено:

Foo *obj = [[Foo alloc] init];
[obj setDelegate:self];

Теперь ваш класс готов к получению сообщений от Foo объектов, у которых правильно установлены делегаты.

8 голосов
/ 05 сентября 2012

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

Вот небольшой пример собственных делегатов ....

  1. Создать класс протокола .... (только .h)

SampleDelegate.h

#import
@protocol SampleDelegate
@optional

#pragma Home Delegate

-(NSString *)getViewName;

@end
  1. Импортировать указанный выше класс протокола в тот класс, который вы хотите сделать делегатом другого класса. Здесь, в моей бывшей. Я использую AppDelegate, чтобы делегировать объект HomeViewController.

также добавьте выше DelegateName в Ссылке на делегат <>

ownDelegateAppDelegate.h

#import "SampleDelegate.h"

@interface ownDelegateAppDelegate : NSObject <UIApplicationDelegate, SampleDelegate>
{


}

ownDelegateAppDelegate.m

//setDelegate of the HomeViewController's object as
[homeViewControllerObject setDelegate:self];

//add this delegate method definition
-(NSString *)getViewName
{
    return @"Delegate Called";
}

HomeViewController.h

#import
#import "SampleDelegate.h"

@interface HomeViewController : UIViewController 
{

    id<SampleDelegate>delegate;
}

@property(readwrite , assign) id<SampleDelegate>delegate;

@end

HomeViewController.h

- (void)viewDidAppear:(BOOL)animated 
{

    [super viewDidAppear:animated];
    UILabel *lblTitle = [[UILabel alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    lblTitle.text = [delegate getViewName];
    lblTitle.textAlignment = UITextAlignmentCenter;
    [self.view addSubview:lblTitle];

}
2 голосов
/ 22 июля 2009

Если у рассматриваемого объекта (ей) есть delegate, назначенный классу, который вы написали, скажем, controller, то методы, определенные как методы delegate класса этого объекта, должны быть реализованы назначенным классом. Это позволяет эффективно контролировать поведение объекта, не подклассифицируя класс объекта, чтобы переопределить поведение, которое, вероятно, потребовало бы некоторого количества дублирующего поведения. Это одна из самых чистых частей дизайна с сенсорным эффектом какао.

Это то, что вы должны поднять в первых парах вступлений и уроков по касанию какао. Как этот урок от Какао - моя девушка . На самом деле объяснение delegate было выделено жирным шрифтом.

2 голосов
/ 14 марта 2009

Для начала вы можете взглянуть на то, что Apple говорит о методах делегирования. Документация содержит некоторую хорошо написанную информацию о том, что такое делегирование, и объясняет как использовать классы AppKit, которые определяют и поддерживают делегата, и как кодировать поддержку делегирования в один из ваших собственных объектов.

См. Общение с объектами

(Если вы заинтересованы в кодировании собственной поддержки делегатов, перейдите к разделу «Реализация делегата для пользовательского класса».)

Наиболее существенным аспектом, который следует исключить из методов делегатов, является то, что они позволяют настраивать и влиять на поведение объекта без необходимости его подкласса.

Надеюсь, это поможет вам начать.

...