Domanda

Ok, sto programmando in obiettivo-C e sto usando Xcode. Ho letto la documentazione sul sito Web di Apple e ho capito cosa sono i delegati, ma quando arrivo alla parte in cui parla di come implementare effettivamente i metodi delegati nel codice, mi confondo, specialmente quando dicono qualcosa come & Quot; ora implementare il metodo del delegato. " Forse sono solo io, ma non so esattamente DOVE implementare il metodo (il file AppDelegate.h / .m sarebbe la posizione corretta in una semplice situazione in cui ho solo la classe ViewController e AppDelegate?). Immagino che il modo migliore per imparare sia vedere un esempio molto semplice.

Ho un po 'di codice qui sotto e mi chiedevo se qualcuno potesse passare e mostrarmi come collegare il delegato al ViewController in modo che mostri la somma? Scusate se il codice sembra lungo, ma questo è l'esempio di delega più semplice a cui potrei pensare. Per ragioni di argomento e avendo meno codice da guardare (rendendo più facile per me vedere cosa sta succedendo), diciamo che il server ServerClass * implementa un server e il client ClientClass * implementa un client. Entrambi sono già collegati tra loro e sono in attesa di inserire il loro numero. Metto giù ciò che penso sia corretto ma so per certo che non è completo (per quanto riguarda la connessione del delegato sia al server che al client). Una cosa che non so dove collocare sono le dichiarazioni di protocollo, quindi se qualcuno potesse fare questo semplice problema, mi aiuterebbe molto per quanto riguarda l'apprendimento di come un delegato è implementato in una classe.

A proposito, sto lavorando con Peer Picker nel nuovo GameKit di iPhone SDK 3.0 se qualcuno vorrebbe anche mostrarmi cosa si collega a cosa. Ad esempio, mi trovo in passaggio 3 della guida Apple per Peer Picker . Ora, non so dove vada il passaggio 5 nel mio progetto. Grazie a tutti coloro che possono aiutarmi a comprendere questa implementazione delegata ... finora siete stati tutti fantastici!

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
È stato utile?

Soluzione

Non entrerò in alcuna analisi dettagliata del codice che hai pubblicato & # 8212; la risposta più utile che potresti ottenere è una direzione per quanto riguarda i principi generali che trascendono un esempio di codice specifico. Ecco i principi generali ...

  • Un delegato è un oggetto i cui oggetti sono (generalmente) chiamati a gestire o rispondere a eventi o azioni specifici.
  • Devi " dire " un oggetto che accetta un delegato di cui si desidera essere il delegato. Questo viene fatto chiamando [object setDelegate:self]; o impostando object.delegate = self; nel tuo codice.
  • L'oggetto che funge da delegato deve implementare i metodi delegati specificati. L'oggetto spesso definisce i metodi in un protocollo o su NSObject tramite una categoria come metodi predefiniti / vuoti o entrambi. (L'approccio del protocollo formale è probabilmente più pulito, soprattutto ora che Objective-C 2.0 supporta metodi di protocollo opzionali.)
  • Quando si verifica un evento rilevante, l'oggetto chiamante verifica se il delegato implementa il metodo corrispondente (usando -respondsToSelector:) e chiama tale metodo se lo fa. Il delegato ha quindi il controllo di fare tutto il necessario per rispondere prima di restituire il controllo al chiamante.

Nell'esempio specifico a cui stai lavorando, nota che GKPeerPickerController ha una proprietà denominata delegate che accetta un oggetto di tipo id<GKPeerPickerControllerDelegate> . Ciò significa un id (qualsiasi sottoclasse di NSObject) che implementa i metodi nel protocollo GKPeerPickerControllerDelegate. GKPeerPickerControllerDelegate a sua volta definisce un numero di metodi e delegare quando definisce saranno chiamati. Se si implementano uno o più di questi metodi (la documentazione dice che tutti sono opzionali, ma due sono previsti) e si registra come delegato, tali metodi verranno chiamati. (Nota che non è necessario dichiarare un prototipo di metodo nel tuo file .h, importa semplicemente l'intestazione del protocollo e implementa il metodo nel tuo file .m.

Altri suggerimenti

Sto imparando lo sviluppo di ObjC e iPhone. Non arriverei così lontano da dire che capisco perfettamente i delegati e il loro uso. La tua prima applicazione per iPhone , trovata sul portale degli sviluppatori sul sito Apple, analizza in dettaglio un esempio molto semplice che utilizza il delegato di TextField per sovrascrivere un metodo per far scomparire la tastiera quando si esegue la modifica su TextField. Ad esempio, se posso incollare frammenti rilevanti da 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

Qui, textFieldShouldReturn è un metodo che fa parte del protocollo UITextFieldDelegate. Per quanto ho capito, ciò che è importante è che in qualunque classe implementi i metodi delegati, quella classe deve seguire il protocollo di quel particolare delegato (avendo un nome di protocollo racchiuso tra parentesi angolari immediatamente accanto a il nome della classe da cui eredita).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top