Question

Ok, je programme en Objective-C et utilise Xcode. J'ai lu la documentation sur le site Web d'Apple et je comprends ce que sont les délégués, mais quand j'arrive à la partie où il est expliqué comment implémenter réellement les méthodes des délégués dans le code, je suis confus, surtout quand ils disent quelque chose comme & Quot; Maintenant, implémentez la méthode du délégué. " Peut-être que c'est juste moi, mais je ne sais pas exactement OU mettre en œuvre la méthode (le fichier AppDelegate.h / .m serait-il l'emplacement correct dans une situation simple où je n'ai que les classes ViewController et AppDelegate?). J'imagine que la meilleure façon d'apprendre pour moi est de voir un exemple très simple.

J'ai un code ci-dessous et je me demandais si quelqu'un pourrait passer et me montrer comment connecter le délégué au ViewController afin qu'il affiche la somme? Désolé si le code semble long, mais c’est l’exemple de délégation le plus simple auquel je puisse penser. Par souci d'argumentation et pour avoir moins de code à regarder (ce qui me permet de voir plus facilement ce qui se passe), disons que ServerClass * serveur implémente un serveur et ClientClass * client implémente un client. Les deux sont déjà connectés l'un à l'autre et attendent de saisir leur numéro. Je note ce que je pense être correct mais je sais avec certitude que ce n'est pas complet (en ce qui concerne la connexion du délégué au serveur et au client). Une chose que je ne sais pas où mettre sont les déclarations de protocole, donc si quelqu'un pouvait faire ce problème simple, cela m'aiderait beaucoup pour apprendre comment un délégué est implémenté dans une classe.

À propos, je travaille avec le sélecteur de pairs dans le nouveau GameKit du SDK iPhone 3.0 si quelqu'un souhaite également me montrer ce qui est lié à quoi. Par exemple, je suis à étape 3 du guide Apple pour le sélecteur de pairs . Maintenant, je ne sais pas où passe l'étape 5 de mon projet. Merci à tous ceux qui peuvent m'aider à comprendre cette implémentation des délégués ... vous avez tous été formidables jusqu'à présent!

ExampleAppDelegate.h

#import <UIKit/UIKit.h>

@class ExampleAppViewController;

@interface ExampleAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    ExampleAppViewController *viewController;
    int sum;
}

@property (nonatomic, retain) sum;
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet ExampleAppViewController *viewController;

-(void) addNum:(int)num;
@end

ExampleAppDelegate.m

#import "ExampleAppDelegate.h"
#import "ExampleAppViewController.h"

@implementation ExampleAppDelegate

@synthesize window;
@synthesize viewController;


- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    application.idleTimerDisabled = YES;

    // Override point for customization after app launch    
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
}


- (void)dealloc {
    [viewController release];
    [window release];
    [super dealloc];
}

-(void)addNum:(int)num {
    sum += num;
}

@end

ExampleAppViewController.h

#import <UIKit/UIKit.h>
#import <GameKit/GameKit.h>

@interface ExampleAppViewcontroller : NSObject {
        IBOutlet UILabel *sumField; // will display the total sum, one number entered //by the server and one entered by the client, on both iPhones after calculation

        int sum; // the total sum after addition;
        ServerClass *server; // some server
        ClientClass *client; // some client
        int num; // the number to add to sum
}

@property(nonatomic, assign) sum;
@property(nonatomic, retain) num;

-(void) displaySum;
@end

ExampleAppViewController.m

#import "ExampleAppViewcontroller.h"

@implementation ExampleAppViewController

@synthesize sum;
@synthesize num;

-(void) displaySum {
    [sumfield setText: @"%i", sum];
}

@end
Était-ce utile?

La solution

Je n’entrerai pas dans une analyse détaillée du code que vous avez posté & # 8212; la réponse la plus utile que vous puissiez obtenir est une indication des principes généraux qui transcendent un exemple de code spécifique. Voici les principes généraux ...

  • Un délégué est un objet dont les objets sont (généralement) appelés pour gérer ou répondre à des événements ou actions spécifiques.
  • Vous devez & "dire &"; un objet qui accepte un délégué que vous souhaitez être le délégué. Pour ce faire, appelez [object setDelegate:self]; ou définissez object.delegate = self; dans votre code.
  • L'objet agissant en tant que délégué doit implémenter les méthodes de délégué spécifiées . L'objet définit souvent des méthodes dans un protocole ou sur NSObject via une catégorie en tant que méthodes par défaut / vides, ou les deux. (L’approche protocolaire formelle est probablement plus propre, d’autant plus que Objective-C 2.0 prend en charge les méthodes de protocole optionnelles.)
  • Lorsqu'un événement pertinent se produit, l'objet appelant vérifie si le délégué met en œuvre la méthode correspondante (à l'aide de -respondsToSelector:) et appelle cette méthode si elle le fait. Le délégué a alors le contrôle pour faire le nécessaire pour répondre avant de rendre le contrôle à l'appelant.

Dans l'exemple spécifique que vous suivez, notez que GKPeerPickerController a une propriété nommée delegate qui accepte un objet de type id<GKPeerPickerControllerDelegate> . Cela signifie un id (toute sous-classe de NSObject) qui implémente les méthodes du protocole GKPeerPickerControllerDelegate. GKPeerPickerControllerDelegate . ils seront appelés. Si vous implémentez une ou plusieurs de ces méthodes (la documentation indique qu'elles sont toutes facultatives, mais deux sont attendues) et que vous vous enregistrez en tant que délégué, ces méthodes seront appelées. (Notez que vous n'avez pas besoin de déclarer un prototype de méthode dans votre fichier .h, il vous suffit d'importer l'en-tête du protocole et de l'implémenter dans votre fichier .m.

Autres conseils

J'apprends le développement ObjC et iPhone. Je n'irais pas jusqu'à dire que je comprends parfaitement les délégués et leur utilisation. Votre première application iPhone , trouvée Sur le portail des développeurs sur le site Apple, vous trouverez un exemple très simple d'utilisation détaillée du délégué de TextField pour remplacer une méthode afin de faire disparaître le clavier lors de la modification du texte. Par exemple, si je peux coller des extraits pertinents à partir de là:

// MyViewController.h
#import <UIKit/UIKit.h>

@interface MyViewController : UIViewController <UITextFieldDelegate> {
        UITextField *textField;
        UILabel *label;
        NSString *string;
}

@property (nonatomic, retain) IBOutlet UITextField *textField;
@property (nonatomic, retain) IBOutlet UILabel *label;
@property (nonatomic, copy) IBOutlet NSString *string;

- (IBAction)changeGreeting:(id)sender;

@end


// MyViewController.m
#import "MyViewController.h"

@implementation MyViewController

@synthesize textField;
@synthesize label;
@synthesize string;

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
        if (theTextField == textField) {
                [textField resignFirstResponder];
        }
        return YES;
}

@end

Ici, textFieldShouldReturn est une méthode qui fait partie du protocole UITextFieldDelegate. Autant que je sache, ce qui est important, c’est que, quelle que soit la classe dans laquelle vous implémentez les méthodes de délégation, cette classe doit suivre le protocole de ce délégué (en plaçant un nom de protocole entre crochets juste à côté de le nom de la classe dont il hérite).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top