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

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

Ответ 1

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

Ответ 2

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

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

  • Создать класс протокола.... (только х)

SampleDelegate.h

#import
@protocol SampleDelegate
@optional

#pragma Home Delegate

-(NSString *)getViewName;

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

также добавьте выше DelegateName в Reference Delegate < >

ownDelegateAppDelegate.h

#import "SampleDelegate.h"

@interface ownDelegateAppDelegate : NSObject <UIApplicationDelegate, SampleDelegate>
{


}

ownDelegateAppDelegate.m

//setDelegate of the HomeViewController 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];

}

Ответ 3

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

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

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

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

Надеюсь, что вы начнете.

Ответ 4

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

Это то, что вы должны забрать в первых двух интро и учебниках до cocoa touch. Например, учебник из cocoa - моя подруга. Фактически они сделали пояснение delegate большим жирным заголовком.