2012-07-14 24 views
6

He definido un protocolo en un archivo separado (myProtocol.h). Aquí está el código para ello:Aplicación IOS: defina el protocolo en un archivo separado

#import <Foundation/Foundation.h> 

@protocol myProtocol <NSObject> 
    -(void) loadDataComplete; 
@end 

Ahora quiero llamar a este método por lo que he hecho el siguiente código:

firstViewController.h:

#import "myProtocol.h" 

@interface firstViewController : UIViewController{ 
    id <myProtocol> delegate; 
} 
@property (retain) id delegate; 
-(void) mymethod; 

firstViewController.m

@implementation firstViewController 
@synthesize delegate; 

- (void)viewDidLoad { 
    [self mymethod]; 
} 

-(void) mymethod { 
    //some code here... 
    [delegate loadDataComplete]; 
} 

tengo otro archivo en el que también se utiliza el protocolo:

secondViewController.h:

#import "myProtocol.h" 
@interface secondViewController : UIViewController<myProtocol>{ 
} 

secondViewController.m:

-(void) loadDataComplete{ 
    NSLog(@"loadDataComplete called"); 
} 

pero mi segundo ViewController no está llamando al protocolo methad. ¿Por que es esto entonces? Cualquier sugerencia será apreciada.

+2

¿Estás realmente creando un objeto y asignándolo como un delegado? Además, tener una fuerte referencia a un delegado no es habitual. Finalmente, los nombres de clase deberían comenzar con una letra mayúscula. – Abizern

+0

configura a su delegado, ¿cuál es el valor de self.delegate into mymethod? tengo la costumbre de usar "yo". para el acceso a la propiedad – divol

Respuesta

11

En primer lugar, como @Abizern sugerido, intente reformatear su código un poco. Use la letra mayúscula para las clases. Dijo que aquí la solución para tu respuesta.

Este es el protocolo. Lo nombraría como FirstViewControllerDelegate ya que la clase que implementa el objeto es un delegado para FirstViewController.

#import <Foundation/Foundation.h> 

@protocol MyProtocol <NSObject> 

- (void)doSomething; 

@end 

Esto es SecondViewController.

#import <UIKit/UIKit.h> 
#import "MyProtocol.h" 

@interface SecondViewController : UIViewController <MyProtocol> 

@end 

@implementation SecondViewController 

// other code here... 

- (void)doSomething 
{ 
    NSLog(@"Hello FirstViewController"); 
} 

@end 

Esto es FirstViewController.

#import <UIKit/UIKit.h> 

@interface FirstViewController : UIViewController 

// it coud be better to declare these properties within a class extension but for the sake of simplicity you could leave here 
// the important thing is to not declare the delegate prop with a strong/retain property but with a weak/assign one, otherwise you can create cycle 
@property (nonatomic, strong) SecondViewController* childController; 
@property (nonatomic, weak) id<MyProtocol> delegate; 

@end 

@implementation FirstViewController 

// other code here... 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.childController = [[SecondViewController alloc] init]; 
    self.delegate = self.childController; // here the central point 

    // be sure your delegate (SecondViewController) responds to doSomething method 
    if(![self.delegate respondsToSelector:@selector(doSomething)]) { 

     NSLog(@"delegate cannot respond"); 
    } else { 

     NSLog(@"delegate can respond"); 
     [self.delegate doSomething]; 
    }  
} 

@end 

Para completar, asegúrese de entender el patrón de delegado significa. Apple doc es tu amigo. Puede echar un vistazo al the-basics-of-protocols-and-delegates para tener una introducción básica sobre el argumento. Además, la búsqueda SO te permite encontrar muchas respuestas sobre el tema.

Espero que ayude.

+0

Obviamente, el patrón 'if-else' se puede mover en' myMethod' si lo desea. –

+1

Gracias Flex_Addicted. Respuesta increíble corrección de poco bit en el código self.delegate = self.childController; en lugar de self.delegate = child; gracias de nuevo. –

+0

@ViralNarshana ¡De nada! Lo siento por el error. Lo arreglé :) –

Cuestiones relacionadas