[英]Cannot find protocol declaration
我有兩個view controllers A
和B
,它們彼此相互作為代表。
當除了在頭文件的開頭定義協議和#import
另一個頭文件之外我什么都沒做的時候,我得到兩個錯誤 -
找不到“BDelegate”的協議聲明,它在Ah(我寫的地方)中顯示無法找到“ADelegate”的協議聲明,它在Bh中顯示(我寫的地方)
在線查看,人們早些時候寫過,包含頭文件的循環包含可能會導致問題。 他們建議使用#include
代替,或者@class
聲明,如 -
@class A
代替
#import A.h
在里面#import Bh
我幾乎嘗試了這些導入的所有組合, @classes
和#include
但仍然無法擺脫警告。 此外,在線解決方案建議將#import
移動到.m
文件,但這也沒有幫助。 部分原因是在線解決方案有點模糊 - 如果你可以分解它會很棒。
關於可以做些什么來解決這個問題的任何建議?
- BigViewController.h -
#import "BaseViewController.h"
#include "BaseViewController.h"
@class BigViewController;
@protocol BigViewControllerDelegate
-(void) BigViewController:(BigViewController *) bigView;
@end
@interface BigViewController : UIViewController <BaseViewControllerDelegate>
{
//delegate
id <BigViewControllerDelegate> delegate;
ivars...
}
@properties...
@end
--------------------------------------------------
- BaseViewController.h -
#<UIKit/UIKit.h>
#import "BigViewController.h"
#include "BigViewController.h"
@class BigViewController;
@protocol BaseViewControllerDelegate
- (void) setParametersWithItemChosen:(Item *) item;
@end
@interface BaseViewController : UIViewController <...BigViewControllerDelegate...>
{
ivars...
//delegate
id <BaseViewControllerDelegate> delegate;
}
@properties...
@end
讓我進一步減少樣本,並標記線條:
VC1.h
#import "VC2.h" // A
@class VC1;
@protocol VC1Delegate // B
@end
@interface VC1 : UIViewController <VC2Delegate> // C
@end
VC2.h
#import "VC1.h" // D
@class VC2;
@protocol VC2Delegate // E
@end
@interface VC2 : UIViewController <VC1Delegate> // F
@end
考慮當#imports VC1.h:它到達A行時會發生什么,然后處理導入。 D行無效,因為VC1.h已經導入。 然后處理E行。 然后是F行,我們得到一個錯誤,因為我們還沒有到達B行,所以沒有聲明協議!
然后考慮一下#imports VC2.h會發生什么:它到達D行,然后處理導入。 A行無效,因為VC2.h已經導入。 然后處理B行。 然后是C行,我們得到一個錯誤,因為我們還沒有得到E行,所以沒有聲明協議!
第一步是重新考慮這兩個類是否真的需要成為彼此的代表。 如果你能打破這個循環,那可能就是你要走的路。 如果沒有,您需要重新構建標題。 最直接的方法可能是將委托放入自己的標題中:
VC1Delegate.h
@class VC1;
@protocol VC1Delegate // B
@end
VC1.h
#import "VC1Delegate.h"
#import "VC2Delegate.h"
@interface VC1 : UIViewController <VC2Delegate> // C
@end
VC2Delegate.h
@class VC2;
@protocol VC2Delegate // E
@end
VC2.h
#import "VC1Delegate.h"
#import "VC2Delegate.h"
@interface VC2 : UIViewController <VC1Delegate> // F
@end
如果現在跟蹤導入,您將看到在@interface行嘗試使用它們之前,現在將始終聲明相應的協議。
在#import行上面寫協議聲明代碼,例如
@結束
@interface classname ---
我有幾乎相同的問題,由於上面的答案,我修復了它,但方式略有不同。
我所做的只是將#import行放在頭文件中的協議聲明之后 。 希望我能幫忙。 如果有人知道由於某種原因這是不好的編程,請告訴我
我找到了另一個解決這個問題的方法,因為我真的不喜歡在類和協議聲明之間只有一些#imports的想法。
基本上,您只需將.h類文件中的<YourProtocolName>
移動到.m文件中的類擴展名即可
所以在你的.m文件中添加
@interface YourClassName () <YourProtocolName>
@end
我不知道這是不是一個好的做法,但它看起來像一個更清潔的解決方案,以避免導入周期。
嘗試將<BaseViewControllerDelegate>或<BigViewControllerDelegate>放在實現文件中,而不是頭文件中。 它會工作。
我在導入之前遵循了移動協議的修復程序並修復了問題...導入包括委托,因此導致了問題。
但后來我想,為什么我還要導入代表呢? 我沒有引用它的屬性,我沒有直接調用它的任何方法(這是協議聲明的用途)。
我試着評論代理的導入,看到錯誤出現的地方,發現當我導入委托時我導入的內容實際上是委托導入的聲明,即我導入A(也是我的委托),A正在導入B,我實際使用的是B.所以我將A的導入留下了注釋並為B添加了一個導入。然后我可以將導入協議順序恢復原樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.