использование Delegate в iphone SDK - PullRequest
2 голосов
/ 03 августа 2010

Может кто-нибудь объяснить мне, как именно делегат работает в iphone SDK ..... ??? Простой пример использования делегата и преимущества использования делегата.

Ответы [ 4 ]

3 голосов
/ 03 августа 2010

Шаблон делегата широко используется в iPhone SDK.Рассмотрим примеры:

  1. Вы запускаете анимацию.Базовая система обрабатывает анимацию для вас.Но естественно, что вы хотите что-то сделать, когда анимация закончится (скажем, вы хотите активировать кнопку или показать текст, когда анимация закончится).Теперь, как система анимации узнает, что делать, когда анимация закончится?В конце концов, это ваше задание.Таким образом, вы настроите делегата для анимации, и система вызовет этот метод делегата, когда анимация закончится.Очевидно, вы будете выполнять свои собственные задачи в этом методе делегата.

  2. У вас есть текстовое поле, и вы хотите знать, когда пользователь коснулся или отредактировал что-то в этом поле.Как ты узнаешь это?Вы настроите делегата для своего текстового поля, и класс UITextField будет вызывать предопределенный метод делегата, когда это конкретное поле будет отредактировано или постучано.

  3. Забыли UIApllicationDelegate?Система выполняет работу по загрузке и запуску приложения.Как он скажет вам, что его инициализация завершена, и теперь вы можете запустить свой код?Он вызовет метод applicationDidFinishLaunching вашего делегата приложения.

  4. Вы делаете асинхронный http-запрос.После загрузки данных будет вызван ваш метод делегата, чтобы вы могли теперь работать с данными.

Есть еще много примеров.Для использования делегата вам потребуется указать объект делегата, а иногда и селектор.Что именно нужно сделать, зависит от того, что вы делаете.То есть настройка делегата анимации отличается от настройки делегата текстового поля.Но общая процедура такая же, то есть вам нужно указать свой объект делегата.

Пример кода для анимации:

CATransition *animation = [CATransition animation];
[animation setDelegate:delegate];  // here delegate is your delegate object

После завершения анимации будет вызван объект

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
вашего делегата, и вы выполните настройку в этом методе.
1 голос
/ 03 августа 2010

Википедия содержит и объяснение, и примеры:)

В программной инженерии шаблон делегирования является шаблоном проектирования в объектно-ориентированном программировании, где объект вместо выполненияодна из заявленных задач - делегирует эту задачу связанному вспомогательному объекту.Это, так сказать, превосходит все ожидания (технически, инверсию ответственности).Вспомогательный объект называется делегатом.Шаблон делегирования является одним из фундаментальных шаблонов абстракции, которые лежат в основе других программных шаблонов, таких как состав (также называемый агрегацией), миксины и аспекты.

1 голос
/ 03 августа 2010

Делегаты - это способ разъединить отправителей и получателей сообщений. Вместо того, чтобы издателю сообщения приходилось #import определять все классы, которые могут быть заинтересованы в сообщении, вместо этого издатель определяет тип делегата и вызывает метод для этого делегата для отправки сообщений. Класс получателя затем реализует делегат.

0 голосов
/ 06 сентября 2016

Основное определение: Делегат - это объект, который действует от имени или в координации с другим объектом, когда этот объект встречает событие в программе. подробнее

Сценарий

(используется при передаче сообщений): Предположим, объект 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

Рабочий пример: код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...