Основное определение:
Делегат - это объект, который действует от имени или в координации с другим объектом, когда этот объект встречает событие в программе.
подробнее
Сценарий
(используется при передаче сообщений):
Предположим, объект A вызывает объект B для выполнения действия. Как только действие завершено, объект A должен знать, что B выполнил задачу, и предпринять необходимые действия. Вот как работает делегирование.
С помощью протоколов мы можем добиться делегирования в iOS. Здесь
код:
ViewControllerA.h
#import <UIKit/UIKit.h>
@interface ViewControllerA : UIViewController
{
}
@end
ViewControllerA.m
#import "ViewControllerA.h"
#import "ViewControllerB.h"
@interface ViewControllerA ()<SimpleProtocol>
@end
@implementation ViewControllerA
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self performSelector:@selector(delegatingWorkToControllerB)withObject:nil afterDelay:3.0];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)delegatingWorkToControllerB{
ViewControllerB *vcB = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerB"];
vcB.delegate = self;
[self presentViewController:vcB animated:YES completion:^{
}];
}
#pragma mark - SimpleProtocol Delegate Method
-(void)updateStatus:(NSString*)status {
NSLog(@"%@",status);
}
@end
ViewControllerB.h
#import <UIKit/UIKit.h>
@protocol SimpleProtocol<NSObject>
-(void)updateStatus:(NSString*)status;
@end
@interface ViewControllerB : UIViewController
{
}
@property(nonatomic, unsafe_unretained)id<SimpleProtocol>delegate;
@end
ViewControllerB.m
#import "ViewControllerB.h"
@interface ViewControllerB ()
@end
@implementation ViewControllerB
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self performSelector:@selector(informingControllerAAfterCompletingWork) withObject:nil afterDelay:3.0];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
}
-(void)informingControllerAAfterCompletingWork{
//you can perform some task here and after completion of the task you can call this to notify the previous controller
[self.delegate updateStatus:@"controller B work has done.. update successfull :)"];
//dismissing the view controller
[self dismissViewControllerAnimated:YES completion:^{
}];
}
@end
Рабочий пример: код