2010-05-13 6 views
22

Il codice:Impostazione il delegato UIImagePickerController tiri un avvertimento circa UINavigationControllerDelegate

UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
picker.delegate = self; 
picker.sourceType = UIImagePickerControllerSourceTypeCamera; 
[self.navigationController presentModalViewController:picker animated:YES]; 
[picker release]; 

L'avvertimento, che si presenta sulla linea di picker.delegate = self;:

Class 'CardEditor' does not implement the 'UINavigationControllerDelegate' protocol 

Perché la cura UIImagePickerController se la mia classe implementa la UINavigationControllerDelegate protocol?

risposta

43

UIImagePickerController eredita da UINavigationController. La proprietà delegato fa parte di UINavigationController, pertanto richiede che il suo delegato sia conforme al protocollo UINavigationControllerDelegate.

Il delegate property è dichiarata in questo modo:

@property(nonatomic, assign) id<UINavigationControllerDelegate> delegate; 

Questo dice al compilatore di verificare che il controller sarà l'attuazione del protocollo UINavigationConrollerDelegate. Il controllo è attivo in modo che possa essere generato un avviso in fase di compilazione se la classe del controller non implementa correttamente tutti i metodi che lo UINavigationController potrebbe inviare al suo delegato.

Se siete alla ricerca di una soluzione, è possibile indicare (nell'interfaccia classe controller) che il controller è compatibile con quel protocollo:

@interface MyController : NSObject <UINavigationControllerDelegate> 
    ... 
@end 

Una volta fatto questo, il compilatore vi avvertirà qualsiasi metodo delegato richiesto che non è stato implementato. Questa è una buona cosa, in quanto ti impedirà di rilasciare codice che potrebbe accidentalmente generare un errore di runtime "metodo non trovato".

+0

Grazie per questo, ho appena trovato questo errore e hai fornito una soluzione rapida :) – KomodoDave

+0

@ KomodoDave: Felice di aiutare! ':' –

+0

@ interfaccia e.James MyController: NSObject ... – yunas

6

e.James ha ragione. Oltre a questo, UINavigationControllerDelegate specifica solo metodi facoltativi. Quindi una soluzione rapida è lasciare che il tuo controller di visualizzazione implementi il ​​protocollo senza implementare nessuno dei suoi metodi.

Ho controllato tutto il codice di esempio Apple per le implementazioni di UIImagePickerControllerDelegate e non implementano nessuno dei metodi UINavigationControllerDelegate. Quindi se non ne hai bisogno non preoccuparti.

16

si può fare in questo modo il file .h

@interface MyController : UIViewController<UINavigationControllerDelegate, UIImagePickerControllerDelegate> 
3

Ho anche affrontato lo stesso problema allora dopo una ricerca ha trovato cioè una soluzione per aggiungere UINavigationControllerDelegate insieme al UIImagePickerControllerDelegate nel file h.

@interface LatestJobsVC : UIViewController <UIImagePickerControllerDelegate , UINavigationControllerDelegate> 

La speranza che ti aiuta. Grazie

Problemi correlati