Давайте предположим, что объект A вызывает объект B для выполнения действия. Как только действие завершено, объект A должен знать, что B выполнил задачу, и предпринять необходимые действия. Это достигается с помощью делегатов.
Ключевые понятия в приведенном выше примере:
-
A является делегатом объекта B.
-
B будет иметь ссылку на A.
-
А будет реализовывать делегатские методы Б.
-
B уведомит A через методы делегата.
A является делегатом объекта B.
B будет иметь ссылку на A.
А будет реализовывать делегатские методы Б.
B уведомит A через методы делегата.
Шаги в создании делегата
Шаг 1 — Сначала создайте приложение с одним представлением.
Шаг 2 — Затем выберите Файл → Создать → Файл …
Шаг 3 — Затем выберите Objective C Class и нажмите Next.
Шаг 4 — Дайте имя классу, скажем, SampleProtocol с подклассом как NSObject, как показано ниже.
Шаг 5 — Затем выберите создать.
Шаг 6 — Добавьте протокол в файл SampleProtocol.h, и обновленный код выглядит следующим образом:
#import <Foundation/Foundation.h> // Protocol definition starts here @protocol SampleProtocolDelegate <NSObject> @required - (void) processCompleted; @end // Protocol Definition ends here @interface SampleProtocol : NSObject { // Delegate to respond back id <SampleProtocolDelegate> _delegate; } @property (nonatomic,strong) id delegate; -(void)startSampleProcess; // Instance method @end
Шаг 7 — Реализуйте метод экземпляра, обновив файл SampleProtocol.m, как показано ниже.
#import "SampleProtocol.h" @implementation SampleProtocol -(void)startSampleProcess { [NSTimer scheduledTimerWithTimeInterval:3.0 target:self.delegate selector:@selector(processCompleted) userInfo:nil repeats:NO]; } @end
Шаг 8 — Добавьте UILabel в ViewController.xib, перетащив метку из библиотеки объектов в UIView, как показано ниже.
Шаг 9. Создайте IBOutlet для метки, назовите его myLabel и обновите код следующим образом, чтобы принять SampleProtocolDelegate в ViewController.h.
#import <UIKit/UIKit.h> #import "SampleProtocol.h" @interface ViewController : UIViewController<SampleProtocolDelegate> { IBOutlet UILabel *myLabel; } @end
Шаг 10 Реализуйте метод делегата, создайте объект для SampleProtocol и вызовите метод startSampleProcess. Обновленный файл ViewController.m выглядит следующим образом:
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; SampleProtocol *sampleProtocol = [[SampleProtocol alloc]init]; sampleProtocol.delegate = self; [myLabel setText:@"Processing..."]; [sampleProtocol startSampleProcess]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - Sample protocol delegate -(void)processCompleted { [myLabel setText:@"Process Completed"]; } @end
Шаг 11 Мы увидим вывод следующим образом. Первоначально метка отображает «обработка …», которая обновляется после вызова метода делегата объектом SampleProtocol.