Что такое "делегат" в разработке iPhone Objective C? [дубликат]
этот вопрос уже есть ответ здесь:
как создать делегатов в Objective-C?
19 ответов
Что такое "делегат" в разработке iPhone Objective C?
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; }объяснение :::
из основного метода, когда
initWithStudent:studentвыполняет1.1 свойство объекта учителя'студент' будет назначен объект student.
1.2
self.student.delegate = selfmeans student object's delegate will points to teacher objectиз основного метода, когда
[student studentInfo]будет называться2.1
[self.delegate respondToSelector:@selector(teacherName)]Здесь делегат уже указывает на объект учителя, чтобы он мог вызывать метод экземпляра 'teacherName'.2.2 так
[self.delegate performSelector:@selector(teacherName)]выполнит легко.похоже, что объект Teacher назначает делегат объекту student для вызова его собственного метод.
это относительная идея, где мы видим, что студент объект называется'teacherName' метод, но это в основном делается самим объектом учителя.
пожалуйста! проверьте ниже простой шаг за шагом учебник, чтобы понять, как делегаты работает в 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.м
#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