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



этот вопрос уже есть ответ здесь:



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

779   10  

10 ответов:

посмотреть этот обсуждение

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

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

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

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

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

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

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

ссылки:

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

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

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

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

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

Классы

студент.h

#import <Foundation/Foundation.h>

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

студент.м

#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

Учитель.h

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

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

Учитель.м

#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

главная.м

#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;
}

объяснение :::

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

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

    1.2 self.student.delegate = self

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

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

    2.2 так [self.delegate performSelector:@selector(teacherName)] выполнит легко.

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

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

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

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

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

  1. делегат реализации FirstViewController (который предоставляет данные).
  2. 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.м


#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.м


#import "FirstViewController.h"

@interface FirstViewController ()
@end

@implementation FirstViewController

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

#pragma mark - View Controller's 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's 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.м


#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

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.