Как использовать пользовательские делегаты в Objective-C

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

4 ответа

Вы захотите объявить протокол делегата для вашего класса. Пример протокола делегата и интерфейса для класса 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 объекты, чьи делегаты установлены правильно.

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

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

  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];

}

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

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

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

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

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

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

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

Другие вопросы по тегам