Учебники

iOS — делегаты

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

Ключевые понятия в приведенном выше примере:

  • A является делегатом объекта B.

  • B будет иметь ссылку на A.

  • А будет реализовывать делегатские методы Б.

  • B уведомит A через методы делегата.

A является делегатом объекта B.

B будет иметь ссылку на A.

А будет реализовывать делегатские методы Б.

B уведомит A через методы делегата.

Шаги в создании делегата

Шаг 1 — Сначала создайте приложение с одним представлением.

Шаг 2 — Затем выберите Файл → Создать → Файл …

Руководство по iOS

Шаг 3 — Затем выберите Objective C Class и нажмите Next.

Шаг 4 — Дайте имя классу, скажем, SampleProtocol с подклассом как NSObject, как показано ниже.

Руководство по iOS

Шаг 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, как показано ниже.

Руководство по iOS

Шаг 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.