2012-04-15 15 views
25

Ho due oggetti, entrambi sono controller di vista. Il primo (Ill call it viewController1) dichiara un protocollo. Il secondo (che, ovviamente, chiamerò viewController2) è conforme a questo protocollo.Impossibile trovare la dichiarazione del protocollo per

XCode mi sta dando un errore di generazione di: 'Non riesco a trovare la dichiarazione di protocollo per viewController1'

ho visto varie domande su questo argomento e sono certo che è a che fare con un errore di ciclo, ma non riesco proprio 't vedere nel mio caso ...

codice seguente ..

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 

Inizialmente, ho avuto la linea di importazione in viewController1 superiore a quella della dichiarazione di protocollo. Questo stava impedendo al progetto di costruire affatto. Dopo aver cercato su SO, ho capito il problema e ho cambiato le due linee. Ora sto ricevendo un avviso (al contrario di un errore). Il progetto si integra perfettamente e funziona perfettamente. Ma sento ancora che ci deve essere qualcosa di sbagliato da dare un avvertimento.

Ora, per quanto posso vedere, quando il compilatore arriva a viewController1.h, la prima cosa che vede è la dichiarazione del protocollo. Quindi importa il file viewController.h e vede che implementa questo protocollo.

Se li stesse compilando al contrario, prima guardava viewController2.h, e la prima cosa che farebbe è importare viewController1.h, la cui prima riga è la dichiarazione del protocollo.

Mi manca qualcosa?

risposta

67

rimuovere questa riga da viewController1.h:

#import "viewController2.h" 

Il problema è che l'interfaccia viewController2 s' è pre-elaborato prima della dichiarazione di protocollo.

La struttura generale del file dovrebbe essere simile a questo:

@protocol viewController1Delegate; 
@class viewController2; 

@interface viewController1 
@end 

@protocol viewController1Delegate <NSObject> 
@end 
+1

Non riesco ... (avrei dovuto dirlo) ... viewController1 deve essere in grado di presentare un viewController2. –

+2

C'è la direttiva '@class viewController2;' per quello. Importa il file di intestazione nel 'viewController1.m'. – Costique

+1

Ho aggiornato la risposta per illustrare il 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

Puoi aggiungere qualche commento o dettaglio? Migliorerebbe la qualità della tua risposta e istruiresti meglio tutti. – NonCreature0714

1

Per coloro che potrebbero averne bisogno:

E 'anche possibile per risolvere questo problema spostando l'importazione di ViewController1. h in ViewController2 Il file di implementazione (.m) invece del file di intestazione (.h).

Come così:

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 

Questo risolverà il caso in cui l'errore si verifica perché ViewController1.h è importata in ViewController2.h prima della dichiarazione di protocollo.

Problemi correlati