Что такое "делегат" в разработке Objective C iPhone?

Что такое "делегат" в разработке iPhone Objective C?

Ответ 1

Смотрите обсуждение

Делегат позволяет одному объекту отправлять сообщения другому объекту, когда происходит событие. Например, если вы загружаете данные с веб-сайта асинхронно, используя класс NSURLConnection. NSURLConnection имеет три общих делегата:

 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
 - (void)connectionDidFinishLoading:(NSURLConnection *)connection
 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

Один или несколько из этих делегатов будут вызваны, когда NSURLConnection обнаруживает сбой, успешно завершает или получает ответ с веб-сайта соответственно.

Ответ 2

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

A Хороший пример UIAlertView. Вы создаете объект UIAlertView, чтобы показывать пользователю короткое окно сообщения, возможно, предоставляя им выбор с помощью двух кнопок, таких как "ОК" и "Отмена". UIAlertView нужен способ перезвонить вам, но у него нет информации о том, какой объект перезвонить и какой метод вызывать.

Чтобы решить эту проблему, вы можете отправить указатель self на UIAlertView в качестве объекта-делегата, и взамен согласитесь (объявив UIAlertViewDelegate в заголовочном файле объекта), чтобы реализовать некоторые методы, которые UIAlertView может вызвать, например alertView:clickedButtonAtIndex:.

Отметьте этот пост для быстрого высокоуровневого ввода в шаблон дизайна делегата и другие методы обратного вызова.

Литература:

Ответ 3

Делегаты - это шаблон проектирования; нет специального синтаксиса или поддержки языка.

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

Ответ 4

Я думаю, что эта статья в Википедии лучше всего описывает ее: http://en.wikipedia.org/wiki/Delegation_pattern

Это "просто" реализация шаблона проектирования и очень распространенная в Objective-C

Ответ 5

Пожалуйста! проверьте ниже простой шаг за шагом учебник, чтобы понять, как делегаты работают в iOS.

Делегировать в iOS

Я создал два ViewControllers (для отправки данных от одного к другому)

  • FirstViewController реализует делегат (который предоставляет данные).
  • SecondViewController объявляет делегат (который будет получать данные).

Вот пример кода может помочь вам.

AppDelegate.h


#import <UIKit/UIKit.h>

@class FirstViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) FirstViewController *firstViewController;

@end

AppDelegate.m


#import "AppDelegate.h"
#import "FirstViewController.h"

@implementation AppDelegate

@synthesize firstViewController;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.

    //create instance of FirstViewController
    firstViewController = [[FirstViewController alloc] init];

    //create UINavigationController instance using firstViewController
    UINavigationController *firstView = [[UINavigationController alloc] initWithRootViewController:firstViewController];

    //added navigation controller to window as a rootViewController
    self.window.rootViewController = firstView;

    [self.window makeKeyAndVisible];
    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

@end

FirstViewController.h


#import <UIKit/UIKit.h>
#import "SecondViewController.h"

@interface FirstViewController : UIViewController<MyDelegate>

@property (nonatomic, retain) NSString *mesasgeData;

@property (weak, nonatomic) IBOutlet UITextField *textField;
@property (weak, nonatomic) IBOutlet UIButton *nextButton;

- (IBAction)buttonPressed:(id)sender;

@property (nonatomic, strong) SecondViewController *secondViewController;

@end

FirstViewController.m


#import "FirstViewController.h"

@interface FirstViewController ()
@end

@implementation FirstViewController

@synthesize mesasgeData;
@synthesize textField;
@synthesize secondViewController;

#pragma mark - View Controller Life Cycle methods

- (void)viewDidLoad
{
    [super viewDidLoad];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];

}

#pragma mark - Button Click event handling method

- (IBAction)buttonPressed:(id)sender {

    //get the input data from text feild and store into string
    mesasgeData = textField.text;

    //go keypad back when button clicked from textfield
    [textField resignFirstResponder];

    //crating instance of second view controller
    secondViewController = [[SecondViewController alloc]init];

    //it says SecondViewController is implementing MyDelegate
    secondViewController.myDelegate = self;

    //loading new view via navigation controller
    [self.navigationController pushViewController:secondViewController animated:YES];    
}

#pragma mark - MyDelegate method implementation

-(NSString *) getMessageString{
    return mesasgeData;
}

@end

SecondViewController.h


//declare our own delegate
@protocol MyDelegate <NSObject>

-(NSString *) getMessageString;

@end

#import <UIKit/UIKit.h>

@interface SecondViewController : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *messageLabel;

@property (nonatomic, retain) id <MyDelegate> myDelegate;

@end

SecondViewController.m


#import "SecondViewController.h"

@interface SecondViewController ()
@end

@implementation SecondViewController

@synthesize messageLabel;
@synthesize myDelegate;

- (void)viewDidLoad
{
    [super viewDidLoad];    
    messageLabel.text = [myDelegate getMessageString];    
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

@end

Ответ 6

Я пытаюсь его проработать с помощью простой программы

Два класса

Student.h

#import <Foundation/Foundation.h>

@interface Student : NSObject
@property (weak) id  delegate;
- (void) studentInfo;
@end

Student.m

#import "Student.h"
@implementation Student
- (void) studentInfo
{
    NSString *teacherName;
    if ([self.delegate respondsToSelector:@selector(teacherName)]) {
        teacherName = [self.delegate performSelector:@selector(teacherName)];
    }
    NSLog(@"\n Student name is XYZ\n Teacher name is %@",teacherName);
}
@end

Teacher.h

#import <Foundation/Foundation.h>
#import "Student.h>

@interface Teacher: NSObject
@property (strong,nonatomic) Student *student;
- (NSString *) teacherName;
- (id) initWithStudent:(Student *)student;
@end

Teacher.m

#import "Teacher.h"

@implementation Teacher

- (NSString *) teacherName
{
    return @"ABC";
}
- (id) initWithStudent:(Student *)student
{
    self = [ super init];
    if (self) {
        self.student = student;
        self.student.delegate = self;
    }
    return self;
}
@end

main.m

#import <Foundation/Foundation.h>
#import "Teacher.h"
int main ( int argc, const char* argv[])
{
    @autoreleasepool {

        Student *student = [[Student alloc] init];
        Teacher *teacher = [[Teacher alloc] initWithStudent:student];

        [student studentInfo];

    }
    return 0;
}

ОБЪЯСНЕНИЕ:

  • Из основного метода, когда initWithStudent:student выполнит

    1.1 Свойству объекта учителя 'student' будет присвоен объект-ученик.

    1.2 self.student.delegate = self

        means student object delegate will points to teacher object
    
  • Из основного метода, когда [student studentInfo] будет называться

    2.1 [self.delegate respondToSelector:@selector(teacherName)]       Здесь делегат уже указывает на объект учителя, чтобы он мог ссылаться        Метод экземпляра "teacherName".

    2.2, поэтому [self.delegate performSelector:@selector(teacherName)]       будет выполняться легко.

Похоже, объект Teacher назначает делегат объекту-ученику для вызова его собственного метода.

Это относительная идея, когда мы видим, что объект-ученик называется методом "teacherName", но в основном это делается самим объектом-учителем.

Ответ 7

Я думаю, что все эти ответы имеют большой смысл, когда вы понимаете делегатов. Лично я пришел из земли C/С++ и до этих процедурных языков, таких как Fortran и т.д., Вот и вот моя 2-минутная попытка найти аналогичные аналоги в парадигме С++.

Если бы я объяснил делегатам программисту на С++/Java, я бы сказал

Что такое делегаты? Это статические указатели на классы внутри другого класса. После назначения указателя вы можете вызвать функции/методы в этом классе. Следовательно, некоторые функции вашего класса "делегированы" (в мире С++ - указатель на указатель объекта класса) в другой класс.

Что такое протоколы? Концептуально он выступает в качестве аналогичной цели в отношении заголовочного файла класса, который вы назначаете как класс делегата. Протокол - это явный способ определения того, какие методы должны быть реализованы в классе, указатель которого был установлен как делегат внутри класса.

Как я могу сделать что-то подобное в С++? Если вы попытаетесь сделать это на С++, вы должны определить указатели на классы (объекты) в определении класса, а затем подключить их к другим классам, которые будут предоставлять дополнительные функции в качестве делегатов вашего базового класса. Но эта проводка должна выполняться в коде и быть неуклюжей и подверженной ошибкам. Цель C предполагает, что программисты не лучше всего поддерживают эту децилингу и предоставляют ограничения компилятора для обеспечения чистой реализации.

Ответ 8

Делегат запускает автоматические события в объектах C. Если вы установите делегат в Object, он отправляет сообщение другому объекту через методы делегата.

Это способ изменить поведение класса, не требуя подкласса.

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

Проще говоря: делегирование - это способ позволить объектам взаимодействовать друг с другом без создания сильных взаимозависимостей между ними.

Ответ 9

Делегат фиксирует действия по записи пользователя и выполняет конкретное действие в соответствии с действием пользователя Taping Action.

Ответ 10

Делегат - это не что иное, как экземпляр объекта Object, который мы можем назвать методами от имени этих объектов. а также помогает создавать методы в rumtime для этих объектов.