Как использовать пользовательские делегаты в 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
объекты, чьи делегаты установлены правильно.
Делегаты очень полезны для ручного управления передачей в массиве контроллеров представления в приложении. Используя делегатов, вы можете очень хорошо управлять потоком управления.
вот небольшой пример собственных делегатов....
- Создать класс протокола.... (только.h)
SampleDelegate.h
#import
@protocol SampleDelegate
@optional
#pragma Home Delegate
-(NSString *)getViewName;
@end
- Импортируйте вышеуказанный класс протокола в класс, который вы хотите сделать делегатом другого класса. Здесь, в моей бывшей. Я использую 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, которые определяют и поддерживают делегат, и как кодировать поддержку делегирования в один из ваших собственных объектов.
(Если вы заинтересованы в написании собственной поддержки делегата, перейдите к разделу "Реализация делегата для пользовательского класса".)
Наиболее важным аспектом, который следует исключить из методов делегатов, является то, что они позволяют настраивать и влиять на поведение объекта без необходимости его подкласса.
Надеюсь, что это поможет вам начать.