Aprendiendo Objetive-C para IOS (Dia 15)

Guion del blog de curso de Objetive-C para IOS – DIA 15
nota: Esto es no es curso propiamente dicho, es un diario de autoaprendizaje de objetive-c, que me sirve para afianzar conocimientos, y de paso, tener un diario de referencia, con ejemplos propios de uso del lenguaje.
————-

Vamos a ver como funciona el tema de los delegados y protocolos con xcode. La idea es que queremos tener 2 viewcontroller. En el primerViewController, tendremos un boton y una eltiqueta,  y el segundoViewController, tendremos un cuadro de texto y un boton.

El boton del primerViewController, lo unico que hara es abrir el segundoViewController, mediante el uso de un SEGUE

Cuando estemos en el segundoViewController, escribiremos algo en el campo de texto, y al darle al boton del segundoViewController, volveremos al primerViewController, y escribiremos el texto del campo de texto, en la etiqueta del primerViewController.

Para esto, creamos un proyecto con las caracteristicas de siempre:

Y Creamos el interface con los dos viewControllers.

A continuacion, tenemos que crearnos 2 subclasses, que derivaran de UIViewController, llamadas primerViewController, y segundoViewController

Una vez echo esto, tenemos que asociar cada uno de lo View Controller del interface grafico, con primerViewController, y segundoViewController. Eso lo haremos desde el interface Grafico, en el apartado identity inspector, tal como hemos hecho otras veces.

Tenemos ahora que crearnos los outlets correspondientes, arrastrando con la tecla CTRL pulsada, a cada uno de los viewControllers.

El codigo quedara de la siguiente forma:

En el primerViewController.h
—————————–

@property (strong, nonatomic) IBOutlet UILabel *etiqueta;
En el primerViewCOntroller.m
—————————–
@synthesize etiqueta;
En el segundoViewController.h
—————————————
@property (strong, nonatomic) IBOutlet UITextField *cajaTexto;
- (IBAction)volver:(id)sender;
En el segundoViewController.m
—————————————

@synthesize cajaTexto;
- (IBAction)volver:(id)sender {
    //Aqui el codigo para cuando pulsemos en el boton
}

Vamos ahora a por el codigo necesario para hacer la delegacion
———————————————————————————————————————

//
//  segundoViewController.h
//  Diario015
//
//  Created by david fraj blesa on 21/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
//Vamos a crear un nuevo Delegate. Un delegate, es una respuesta ante un evento. Lo que hacemos es que, dentro de este delegate
//creamos un metodo llamado devolverValor, que recibira un texto
@protocol segundoViewControllerDelegate <NSObject>
– (void)devolverValor:(NSString *)texto;
@end
//Empieza el objeto segundoViewController.
@interface segundoViewController : UIViewController
//propiedad traida desde el interface builder
@property (strong, nonatomic) IBOutlet UITextField *cajaTexto;
//Creamos una nueva propiedad, que sera el delegado, y sera de tipo segundoViewController definido arriba
@property (nonatomic, weak) id <segundoViewControllerDelegate> delegate;
//Encabezado del metodo volver, que se ejecutara al pulsar el boton
– (IBAction)volver:(id)sender;
@end
//Finaliza el segundoViewController
———————————————————————————————————————
//
//  segundoViewController.m
//  Diario015
//
//  Created by david fraj blesa on 21/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «segundoViewController.h»
@implementation segundoViewController
//Getter y Setters de cajaTexto
@synthesize cajaTexto;
//Getter y Setters de delegate
@synthesize delegate;
//Implementamos el metodo volver.
– (IBAction)volver:(id)sender {
    //El delegate, implementa el metodo devolverValor, al que le pasamos un texto, que sera el de cajaTexto
    [delegate devolverValor:self.cajaTexto.text];
}
– (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{

………

———————————————————————————————————————

//
//  primerViewController.h
//  Diario015
//
//  Created by david fraj blesa on 21/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
//Importamos el segundoViewCOntroller.h
#import «segundoViewController.h»
//Aqui es cuando le decimos, que hay que usar el protocolo segundoViewControllerDelegate, asi que tenemos
//que implementar obligatoriamente el metodo definido en el protocolo, que sera devolverValor
//Esto lo haremos en el primerViewController.m
@interface primerViewController : UIViewController <segundoViewControllerDelegate>{
    
}
@property (weak, nonatomic) IBOutlet UILabel *etiqueta;
@end





———————————————————————————————————————

//
//  primerViewController.m
//  Diario015
//
//  Created by david fraj blesa on 21/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «primerViewController.h»
@implementation primerViewController
@synthesize etiqueta;
//Como hemos puesto como protocolo obligatorio el <segundoViewController>, tenemos que implementar
//sus metodos si o si.
– (void)devolverValor:(NSString *)texto {
    self.etiqueta.text = texto;
    [self dismissModalViewControllerAnimated:YES];
}
//Al llamar al segundoViewController mediante el SEGUE, debemos decirle, cual es el delegate del segundoViewController.
//El delegate del segundoViewController, debe ser primerViewController.
– (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    segundoViewController * segundoViewController = segue.destinationViewController;
    segundoViewController.delegate = self;
}


– (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
………



———————————————————————————————————————

Eso es todo!!!

Aqui hemos visto pues un ejemplo de como implementar un protocolo, y como usarlo dentro de nuestra clase.

Un saludo!!!