Pregunta

Ok, estoy programando en Objective-C y usando Xcode. He leído la documentación en el sitio web de Apple y entiendo qué son los delegados, pero cuando llego a la parte en la que habla sobre cómo implementar realmente los métodos de delegado en el código, me confundo, especialmente cuando dicen algo como & Quot; ahora implemente el método del delegado. " Tal vez sea solo yo, pero no sé exactamente DÓNDE implementar el método (¿el archivo AppDelegate.h / .m sería la ubicación correcta en una situación simple en la que solo tengo la clase ViewController y AppDelegate?). Creo que la mejor forma de aprender es ver un ejemplo muy simple.

Tengo un código a continuación y me preguntaba si alguien podría pasar y mostrarme cómo conectar el delegado al ViewController para que muestre la suma. Lo siento si el código parece largo, pero este es el ejemplo de delegación más simple que se me ocurre. En aras de la discusión y de tener menos código para mirar (haciéndome más fácil ver lo que sucede), digamos que el servidor ServerClass * implementa un servidor y el cliente ClientClass * implementa un cliente. Ambos ya están conectados entre sí y están esperando ingresar su número. Dejo lo que creo que sería correcto, pero sé con certeza que no está completo (en lo que respecta a conectar el delegado al servidor y al cliente). Una cosa que no sé dónde poner son las declaraciones de protocolo, por lo que si alguien pudiera hacer este simple problema, me ayudaría mucho en cuanto a aprender cómo se implementa un delegado en una clase.

Por cierto, estoy trabajando con Peer Picker en el nuevo GameKit del iPhone SDK 3.0 si alguien también quisiera mostrarme qué se conecta a qué. Por ejemplo, estoy en paso 3 de la guía de Apple para Peer Picker . Ahora, no sé a dónde va el paso 5 en mi proyecto. Gracias a todos los que pueden ayudarme a comprender esta implementación de delegado ... ¡hasta ahora han sido geniales!

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
¿Fue útil?

Solución

No entraré en ningún análisis detallado del código que publicó & # 8212; La respuesta más útil que podría obtener es alguna dirección en cuanto a los principios generales que trascienden un ejemplo de código específico. Aquí están los principios generales ...

  • Un delegado es un objeto cuyos objetos son (generalmente) llamados para manejar o responder a eventos o acciones específicos.
  • Debe " decirle a " un objeto que acepta un delegado que desea que sea el delegado. Esto se hace llamando a [object setDelegate:self]; o configurando object.delegate = self; en su código.
  • El objeto que actúa como delegado debe implementar los métodos delegados especificados. El objeto a menudo define métodos en un protocolo o en NSObject a través de una categoría como métodos predeterminados / vacíos, o ambos. (El enfoque de protocolo formal es probablemente más limpio, especialmente ahora que Objective-C 2.0 admite métodos de protocolo opcionales).
  • Cuando ocurre un evento relevante, el objeto que realiza la llamada verifica si el delegado implementa el método de coincidencia (usando -respondsToSelector:) y llama a ese método si lo hace. El delegado tiene control para hacer lo que sea necesario para responder antes de devolver el control a la persona que llama.

En el ejemplo específico en el que está trabajando, observe que GKPeerPickerController tiene una propiedad llamada delegate que acepta un objeto de tipo id<GKPeerPickerControllerDelegate> . Esto significa una id (cualquier subclase de NSObject) que implementa los métodos en el protocolo GKPeerPickerControllerDelegate. GKPeerPickerControllerDelegate a su vez define una serie de métodos de delegado y describe cuándo Serán llamados. Si implementa uno o más de esos métodos (la documentación dice que todos son opcionales, pero se esperan dos) y se registra como delegado, se llamarán esos métodos. (Tenga en cuenta que no necesita declarar un prototipo de método en su archivo .h, solo importe el encabezado del protocolo e implemente el método en su archivo .m.

Otros consejos

Estoy aprendiendo el desarrollo de ObjC y iPhone. No llegaría tan lejos como para decir que entiendo perfectamente a los delegados y su uso. Su primera aplicación para iPhone , encontrada en el portal del desarrollador en el sitio de Apple, muestra en detalle un ejemplo muy simple que utiliza el delegado de TextField para anular un método para hacer que el teclado desaparezca cuando se realiza la edición en TextField. Por ejemplo, si puedo pegar fragmentos relevantes desde allí:

// 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

Por aquí, textFieldShouldReturn es un método que forma parte del protocolo UITextFieldDelegate. Por lo que he entendido, lo importante es que, en cualquier clase en la que implemente los métodos de delegado, esa clase debe seguir el protocolo de ese delegado en particular (al tener un nombre de protocolo encerrado entre paréntesis angulares inmediatamente al lado de el nombre de la clase de la que hereda).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top