2013-02-21 21 views
6

Ho dichiarato un protocollo e poi lo uso. Ma ricevo un avviso "Impossibile trovare la definizione del protocollo per LeveyPopListViewDelegate". ecco il codice:Impossibile trovare la definizione del protocollo per XXX

@protocol LeveyPopListViewDelegate; 

@interface LeveyPopListView : UIView <LeveyPopListViewDelegate,UITableViewDataSource, UITableViewDelegate,UITextFieldDelegate> 

//the content of LeveyPopListView 

@end 

@protocol LeveyPopListViewDelegate <NSObject> 
//the definition for LeveyPopListViewDelegate 
@end 

se metto la definizione LeveyPopListViewDelegate in un primo momento, non posso utilizzare il LeveyPopListView nel protocollo.

+3

Max_: Mentre alcune cose che eravamo soliti fare con i delegati ora sono fatte meglio con i blocchi, ci sono MOLTE ragioni per usare i protocolli. –

+0

su quale versione di XCode sei? – foundry

+0

Xcode Versione 4.6 (4H127) –

risposta

2

ho sempre fare in questo modo:

@class LeveyPopListView; 

@protocol LeveyPopListViewDelegate <NSObject> 
//the definition for LeveyPopListViewDelegate 
@end 

@interface LeveyPopListView : UIView <LeveyPopListViewDelegate,UITableViewDataSource, UITableViewDelegate,UITextFieldDelegate> 

//the content of LeveyPopListView 

@end 
+0

Ma voglio usare LeveyPopListView in 'protocol' LeveyPopListViewDelegate –

+1

È possibile con quello che ho postato. Questo è il punto della dichiarazione di classe avanzata. – rmaddy

+0

Grazie mille. Ma perché dichiarare un protocollo prima riceverà un avvertimento? –

0

È necessario definire il protocollo prima. Prova come sotto

@protocol LeveyPopListViewDelegate <NSObject> 
//the definition for LeveyPopListViewDelegate 
@end 

@interface LeveyPopListView : UIView <LeveyPopListViewDelegate,UITableViewDataSource, UITableViewDelegate,UITextFieldDelegate> 

//the content of LeveyPopListView 

@end 
+0

Ma voglio utilizzare LeveyPopListView nel protocollo LeveyPopListViewDelegate –

+0

È possibile inoltrare dichiarazione LeveyPopListView sopra la definizione del protocollo. i.e @class LeveyPopListView; – nkongara

+0

Ho capito. Grazie mille. –

2

Se hai seguito il buon consiglio in questo post e hai ancora il problema prova solo a fare un pulito. Mi sono grattato la testa per un po 'e una pulizia ha risolto il problema.

0

È insolito utilizzare un nome classe concreto in una definizione di protocollo. Cosa dovresti fare (la maggior parte dei casi, le eccezioni potrebbero applicarsi ... anche se sono un cattivo odore) è rendere la classe conforme a un protocollo e usare quella classe nella definizione del protocollo delegato.

È anche un cattivo odore che una classe deve essere il proprio delegato. Modificherei attentamente il design.

3

Ho finito per sopprimere tutti gli avvisi per quella particolare linea, che non è l'ideale ma funziona bene.

// Forward-declare protocols (to avoid circular inclusion) 
 
@protocol YourProtocol; 
 

 
#pragma clang diagnostic push 
 

 
#pragma clang diagnostic ignored "-Weverything" // To get rid of 'No 
 
    protocol definition found' warnings which are not accurate 
 
@interface YourClass : NSObject 
 
    <YourProtocol> 
 
#pragma clang diagnostic pop

Assicurati di fare spingere & pop, altrimenti si ritroverà con tutte le avvertenze di essere ignorati per questo file!

+0

Questo ha fatto il trucco. Poiché sto utilizzando un protocollo Swift, quello era l'unico modo per rimuovere questo avviso. Ho anche trovato una buona fonte [qui in questo blogpost di NSHipster] (http://nshipster.com/clang-diagnostics/) –

Problemi correlati