2010-05-13 32 views
22

代碼警告:設置的UIImagePickerController委託拋出一個關於UINavigationControllerDelegate

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

警告,這表明了在picker.delegate = self;行:

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

爲什麼,如果我的類實現的UIImagePickerController護理UINavigationControllerDelegate協議?

回答

43

UIImagePickerController繼承自UINavigationController。代表屬性是UINavigationController的一部分,因此它要求其委託符合UINavigationControllerDelegate協議。

delegate property聲明,像這樣:

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

這告訴編譯器來驗證你的控制器將實現UINavigationConrollerDelegate協議。檢查到位,以便如果您的控制器類未正確實施UINavigationController可能發送給其委託的所有方法,則可能會生成編譯時警告。

如果你正在尋找一個解決方案,您可以指示(在你的控制器類接口)控制器符合該協議:

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

一旦做到這一點,編譯器會警告你您尚未實施的任何必需的委託方法。這是一件好事,因爲它會阻止您釋放可能意外拋出「找不到方法」運行時錯誤的代碼。

+0

謝謝你,我只是遇到了這個錯誤,你提供了一個快速的解決方案:) – KomodoDave 2011-10-12 14:30:53

+0

@KomodoDave:很高興幫助! ':)' – 2011-10-12 16:51:29

+0

@ e.James接口MyController:NSObject ... – yunas 2012-05-28 07:52:40

6

e.James是對的。除此之外,UINavigationControllerDelegate僅指定可選方法。所以一個快速的解決方案就是讓你的視圖控制器在不實現任何方法的情況下實現協議。

我已經檢查了所有用於UIImagePickerControllerDelegate實現的Apple示例代碼,它們都沒有實現任何UINavigationControllerDelegate方法。所以如果你不需要他們不要擔心。

16

您可以在.h文件

@interface MyController : UIViewController<UINavigationControllerDelegate, UIImagePickerControllerDelegate> 
3

像這樣做我也面臨同樣的問題,然後搜索後找到了解決辦法即與在.h文件中的UIImagePickerControllerDelegate一起添加UINavigationControllerDelegate。

@interface LatestJobsVC : UIViewController <UIImagePickerControllerDelegate , UINavigationControllerDelegate> 

希望能幫到你。 謝謝

相關問題