Frage

Diese Frage hat hier bereits eine Antwort:

Was ist ein "Delegierter" in der iPhone -Entwicklung von Objective C?

War es hilfreich?

Lösung

Sieh dir das an Diskussion

Ein Delegierter ermöglicht ein Objekt, Nachrichten an ein anderes Objekt zu senden, wenn ein Ereignis stattfindet. Wenn Sie beispielsweise Daten von einer Website asynchron herunterladen, verwenden Sie die NsurlConnection -Klasse. NsurlConnection hat drei gemeinsame Delegierte:

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

Ein oder mehrere dieser Delegierten werden aufgerufen, wenn NsurlConnection auf einen Fehler trifft, erfolgreich abgeschlossen oder eine Antwort von der Website erhalten hat.

Andere Tipps

Ein Delegierter ist ein Zeiger auf ein Objekt mit einer Reihe von Methoden, die der Delegierte, der angerufen wird. Mit anderen Worten, es ist Ein Mechanismus, um spezifische Rückrufe zu ermöglichen von einem später geschaffenen Objekt.

EIN Gutes Beispiel ist UIAlertView. Sie erstellen a UIAlertView Objekt, um den Benutzern ein kurzes Nachrichtenfeld anzuzeigen und ihnen möglicherweise eine Auswahl mit zwei Schaltflächen wie "OK" und "Abbrechen" zu geben. Das UIAlertView Benötigt eine Möglichkeit, Sie zurückzurufen, aber es gibt keine Informationen darüber, welches Objekt zurückgerufen werden muss und welche Methode Sie anrufen müssen.

Um dieses Problem zu lösen, können Sie Ihre senden self Zeiger auf UIAlertView Als Delegierungsobjekt und im Gegenzug stimmen Sie zu (indem Sie die deklarieren UIAlertViewDelegate in der Header -Datei Ihres Objekts), um einige Methoden zu implementieren, die UIAlertView kann anrufen, wie z. alertView:clickedButtonAtIndex:.

Kasse dieser Beitrag zum Ein kurzes Intro auf hoher Ebene in das Delegierte-Design-Muster und andere Rückruftechniken.

Verweise:

Delegierte sind ein Designmuster; Es gibt keine spezielle Syntax oder Sprachunterstützung.

Ein Delegierter ist nur ein Objekt, an das ein anderes Objekt Nachrichten sendet, wenn bestimmte Dinge geschehen, damit der Delegierte App-spezifische Details verarbeiten kann, für die das ursprüngliche Objekt nicht konzipiert wurde. Es ist eine Möglichkeit, das Verhalten ohne Unterklasse anzupassen.

Ich denke, dieser Wikipedia -Artikel beschreibt es am besten: http://en.wikipedia.org/wiki/delegation_pattern

Es ist "nur" eine Implementierung eines Entwurfsmuster

Ich versuche es durch einfaches Programm zu erläutern

Zwei Klassen

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

Lehrer.h

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

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

Lehrer.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;
}

ERLÄUTERUNG :::

  1. Von der Hauptmethode wenn initWithStudent:student wird ausführen

    1.1 Eigentum des Objekts des Lehrers 'Schüler'wird mit einem Studentenobjekt zugewiesen.

    1.2 self.student.delegate = self

        means student object's delegate will points to teacher object
    
  2. Von der Hauptmethode wenn [student studentInfo] wird angerufen werden

    2.1 [self.delegate respondToSelector:@selector(teacherName)]Hier delegieren Sie bereits auf das Lehrerobjekt, damit es die Instanzmethode "Teachername" aufrufen kann.

    2.2 Also [self.delegate performSelector:@selector(teacherName)]wird leicht ausführen.

Es sieht so aus, als ob Lehrerobjekt Delegierter dem Schüler Objekt zuweisen, um seine eigene Methode aufzurufen.

Es ist eine relative Idee, bei der wir sehen, dass das Studentenobjekt bezeichnet wird.Name des Lehrers'Methode, aber es wird im Grunde genommen vom Lehrerobjekt selbst durchgeführt.

Bitte! Überprüfen Sie die folgenden einfachen Schritt -für -Schritt -Tutorial, um zu verstehen, wie Delegierte in iOS arbeiten.

Delegierter in iOS

Ich habe zwei ViewController erstellt (zum Senden von Daten von einem an einen anderen)

  1. FirstViewController implementieren Delegate (das Daten liefert).
  2. SecondViewController deklarieren Sie den Delegierten (der Daten empfängt).

Hier ist der Beispielcode kann Ihnen helfen.

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'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.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

Ich denke, all diese Antworten machen viel Sinn, wenn Sie die Delegierten verstehen. Persönlich bin ich aus dem Land von C/C ++ und vor diesen prozeduralen Sprachen wie FORTRAN usw.. Hier ist meine 2 -minütige Nehmen Sie ähnliche Analoga im C ++ - Paradigma.

Wenn ich Delegierten einem C ++/Java -Programmierer erklären würde, würde ich sagen, ich würde sagen

Was sind Delegierte? Dies sind statische Zeiger auf Klassen innerhalb einer anderen Klasse. Sobald Sie einen Zeiger zuweisen, können Sie Funktionen/Methoden in dieser Klasse aufrufen. Daher sind einige Funktionen Ihrer Klasse "delegiert" (in C ++ - Welt - Zeiger auf einen Klassenobjektzeiger) auf eine andere Klasse.

Was sind Protokolle? Konzeptionell dient es als ähnlicher Zweck in der Header -Datei der Klasse, die Sie als Delegierklasse zuweisen. Ein Protokoll ist eine explizite Möglichkeit, zu definieren, welche Methoden in der Klasse implementiert werden müssen, deren Zeiger als Delegierter innerhalb einer Klasse festgelegt wurde.

Wie kann ich in C ++ etwas Ähnliches tun? Wenn Sie dies in C ++ tun möchten, würden Sie durch die Definition von Zeigern auf Klassen (Objekte) in der Klassendefinition und dann auf andere Klassen verkabelt, die zusätzliche Funktionen als Delegierte für Ihre Basisklasse liefern. Diese Verkabelung muss jedoch im Code maitiert werden und ist ungeschickt und fehleranfällig. Objective C geht nur davon aus, dass Programmierer diese Entschlüsselung nicht am besten aufrechterhalten können, und bietet Compiler -Beschränkungen, um eine saubere Implementierung durchzusetzen.

Der Delegierte feuert die automatischen Ereignisse in Objekten C ab. Wenn Sie den Delegierten auf Objekt festlegen, sendet er die Nachricht über die Delegiertenmethoden an ein anderes Objekt.

Dies ist eine Möglichkeit, das Verhalten einer Klasse zu ändern, ohne dass eine Unterklasse erforderlich ist.

Jedes Objekt mit den Delegiertenmethoden. Diese Delegierten -Methoden feuern, wenn die jeweiligen Objekte an Benutzerinteraktion und Programmflusszyklus der Benutzer teilnehmen.

Einfach gesagt: Delegation ist eine Möglichkeit, Objekte miteinander zu interagieren, ohne starke Interdependenzen zwischen ihnen zu erzeugen.

Ein Delegierter erfasst die Aufzeichnungsaktionen eines Benutzers und führt eine bestimmte Aktion gemäß der Benutzeraufzeichnungsaktion aus.

Delegierter ist nichts anderes als eine Instanz des Objekts, die wir Methoden für diese Objekte bezeichnen können. und hilft auch, Methoden in Rumtime dieser Objekte zu erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top