2012-04-15 11 views
25

Tengo dos objetos, los cuales son controladores de vista. El primero (lo llamaré viewController1) declara un protocolo. El segundo (que, como era de esperar, denominaré viewController2) se ajusta a este protocolo.No se puede encontrar la declaración de protocolo para

XCode me está dando un error de generación de: 'No se puede encontrar la declaración protocolo para viewController1'

que he visto varias preguntas sobre este tema y estoy seguro de que tiene que ver con un error de regulación, pero yo sólo puedo 't ver en mi caso ...

código de abajo ..

viewController1.h

@protocol viewController1Delegate; 

#import "viewController2.h" 

@interface viewController1 { 

} 

@end 

@protocol viewController1Delegate <NSObject> 

// Some methods 

@end 

viewController2.h

#import "viewController1.h" 

@interface viewController2 <viewController1Delegate> { 

} 

@end 

Al principio, yo tenía la línea de importación en viewController1 por encima de la de la declaración de protocolo. Esto impedía que el proyecto se construyera. Después de buscar en SO, me di cuenta del problema y cambié las dos líneas. Ahora recibo una advertencia (a diferencia de un error). El proyecto funciona bien y realmente funciona perfectamente. Pero todavía siento que debe haber algo malo para recibir una advertencia.

Ahora, por lo que puedo ver, cuando el compilador obtiene viewController1.h, lo primero que ve es la declaración del protocolo. A continuación, importa el archivo viewController.h y ve que implementa este protocolo.

Si los estuviera compilando al revés, vería viewController2.h primero, y lo primero que haría sería importar viewController1.h, cuya primera línea es la declaración del protocolo.

¿Echo de menos algo?

Respuesta

67

elimine esta línea de viewController1.h:

#import "viewController2.h" 

El problema es que la interfaz viewController2 's es preprocesado antes de la declaración de protocolo.

La estructura general del archivo debería ser así:

@protocol viewController1Delegate; 
@class viewController2; 

@interface viewController1 
@end 

@protocol viewController1Delegate <NSObject> 
@end 
+1

No puedo ... (Debería haber dicho) ... viewController1 necesita poder presentar un viewController2. –

+2

Existe la directiva '@ class viewController2;' para eso. Importe el archivo de encabezado en 'viewController1.m'. – Costique

+1

Actualicé la respuesta para ilustrar el punto. – Costique

1
A.h: 
    #import "B.h" // A 

    @class A; 

    @protocol Delegate_A 
     (method....) 
    @end 

    @interface ViewController : A 
    @property(nonatomic,strong)id<ViewControllerDelegate> preViewController_B;(protocol A) 
    @end 


    B.h: 
    #import "A.h" // A 

    @class B; 

    @protocol Delegate_B 
     (method....) 
    @end 

    @interface ViewController : B 
    @property(nonatomic,strong)id<ViewControllerDelegate> preViewController_A;(protocol B) 
    @end 

    A.m: 
    @interface A()<preViewController_B> 
    @end 

    @implementation A 
    (implement protocol....) 
    end 


    B.m: 
    @interface B()<preViewController_A> 
    @end 

    @implementation B 
    (implement protocol....) 
    @end 
+0

¿Puede agregar algunos comentarios o detalles? Mejorará la calidad de su respuesta y educará mejor a todos. – NonCreature0714

1

Para aquellos que lo requieran:

También cabe la posibilidad de solucionar este problema moviendo la importación de ViewController1. h en ViewController2 's archivo de implementación (.m) en lugar del archivo de encabezado (.h).

así:

ViewController1.h

#import ViewController2.h 

@interface ViewController1 : UIViewController <ViewController2Delegate> 
@end 

ViewController2.h

@protocol ViewController2Delegate; 

@interface ViewController2 
@end 

ViewController2.m

#import ViewController2.h 
#import ViewController1.h 

@implementation ViewController2 
@end 

Esto solucionará el caso en que ocurre el error porque ViewController1.h ha sido importada en ViewController2.h antes de la declaración de protocolo.

Cuestiones relacionadas