簡體   English   中英

找不到協議聲明

[英]Cannot find protocol declaration

我有兩個view controllers AB ,它們彼此相互作為代表。

當除了在頭文件的開頭定義協議和#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM