2012-04-03 59 views
5

由於最近我有一個導入週期,我將所有的#import語句(關於我自己的文件)從標題移動到相應的.m-文件中。我還添加了@class@protocol前向聲明來安撫編譯器。不過,我仍然得到他以下警告:即使使用了@protocol,Xcode也會警告丟失的協議定義

Cannot find the protocol definition for 'MyCustomDelegate'. 

正如我所說的,有一個@protocol MyCustomDelegate之前,我在@interface - 塊使用它。有趣的是,如果相應的委託在另一個文件(其頭文件被導入到.m-文件中)中聲明,則只會發生此警告。

我讀到一種解決方案是將委託聲明在單獨的頭文件中,並直接將該文件導入實現委託的類的頭文件中。這真的是要走的路嗎?還有其他解決方案嗎?我認爲這些代表已經足夠臃腫我們的代碼了,現在我應該繼續,甚至爲它聲明一個自己的文件?

小樣本代碼以更好地說明該問題:

NewFooController.h

#import <UIKit/UIKit.h> 

@protocol NewFooControllerDelegate; 

@interface NewFooController : UITableViewController 
    @property (nonatomic, weak) id<NewFooControllerDelegate> delegate; 
@end 

@protocol NewFooControllerDelegate 
@end 

HomeTableViewController.h

#import <UIKit/UIKit.h> 
@protocol NewFooControllerDelegate; 

// warning points to line below 
@interface HomeTableViewController : UITableViewController <NewFooControllerDelegate> 
@end 

HomeTableViewController.m

#import "HomeTableViewController.h" 
#import "NewFooController.h" 
@implementation HomeTableViewController 
@end 
+0

你在哪裏導入NewFooController.h刪除協議的聲明? – 2012-04-03 12:43:46

+0

對不起,我複製並粘貼了部分代碼。 ;)我將'#import'NewTaskController.h''更改爲'#import'NewFooController.h' – 2012-04-03 14:03:25

回答

0

HomeTableViewController.h引用該協議,但尚未聲明。 如果您在HomeTableViewController.h中導入NewTaskController.h,然後它會嘗試使用它,它應該可以解決您的問題。

當然你也可以再從HomeTableViewController.m

+2

我知道它沒有被聲明,我知道在頭文件中導入它可以解決問題。原因是我將輸入從頭文件移動到'.m'文件是import-cycles。所以我需要一個解決方案來擺脫警告*並且不能導入導入循環*。正如我發佈的,一個可行的選項是將協議聲明寫入一個單獨的文件中,我只想知道是否有更多的解決方案,這些解決方案符合我的需求 – 2012-04-03 14:05:52

+0

@FlorianPilz,對此有任何更新?我有同樣的問題。 – 2015-07-14 13:48:34

0

不知道這是「最好的辦法」刪除了進口,而是要設法實現之前類的頭文件協議類的進口頭。

HomeTableViewController.m

#import "NewFooController.h" 
#import "HomeTableViewController.h" 

@implementation HomeTableViewController 
@end 

而且你可以在HomeTableViewController.h

#import <UIKit/UIKit.h> 

@interface HomeTableViewController : UITableViewController <NewFooControllerDelegate> 
@end 
相關問題