2010-05-13 2 views
22

Der Code:die UIImagePickerController Delegat Einstellung wirft eine Warnung über UINavigationControllerDelegate

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

Die Warnung, die auf der picker.delegate = self; Linie zeigt nach oben:

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

Warum die UIImagePickerController kümmert sich, wenn meine Klasse implementiert die UINavigationControllerDelegate-Protokoll?

Antwort

43

UIImagePickerController erbt von UINavigationController. Die Delegateigenschaft ist Teil von UINavigationController, daher muss der Delegat dem UINavigationControllerDelegate-Protokoll entsprechen.

Die delegate property ist wie so erklärt:

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

Dies teilt den Compiler, um zu überprüfen, dass der Controller das UINavigationConrollerDelegate Protokoll umsetzt. Die Überprüfung ist vorhanden, sodass eine Kompilierungswarnung generiert werden kann, wenn Ihre Controller-Klasse nicht alle Methoden korrekt implementiert, die die UINavigationController an ihren Delegaten senden könnte.

Wenn Sie nach einer Lösung suchen, können Sie (in Ihrer Controller-Klasse-Schnittstelle) zeigen, dass der Controller mit dem Protokoll kompatibel ist:

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

Sobald dies geschehen ist, wird der Compiler warnen Sie alle erforderlichen Delegate-Methoden, die Sie nicht implementiert haben. Dies ist eine gute Sache, da es Sie davon abhält, Code zu veröffentlichen, der versehentlich einen Laufzeitfehler "Methode nicht gefunden" auslösen könnte.

+0

Vielen Dank für diese, ich kam gerade über diesen Fehler und Ihnen zur Verfügung gestellten eine schnelle Lösung :) – KomodoDave

+0

@KomodoDave: Glad zu helfen! ':)' –

+0

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

6

e.James ist richtig. Außerdem gibt UINavigationControllerDelegate nur optionale Methoden an. Eine schnelle Lösung besteht also darin, dass Ihr View Controller das Protokoll implementiert, ohne eine der Methoden zu implementieren.

Ich habe alle Apple Beispielcode für Implementierungen von UIImagePickerControllerDelegate überprüft und sie alle implementieren keine der UINavigationControllerDelegate Methoden. Also, wenn du sie nicht brauchst, mach dir keine Sorgen.

16

Sie können

@interface MyController : UIViewController<UINavigationControllerDelegate, UIImagePickerControllerDelegate> 
3

ich sah sich auch das gleiche Problem dann bei der H-Datei es so tun, nachdem eine Suche, die Lösung heißt gefunden UINavigationControllerDelegate zusammen mit Ihrem UIImagePickerControllerDelegate in .h-Datei hinzuzufügen.

@interface LatestJobsVC : UIViewController <UIImagePickerControllerDelegate , UINavigationControllerDelegate> 

Hoffnung, die Ihnen hilft. Dank

Verwandte Themen