2011-03-24 86 views
5

我有這樣一類..無法找到「MyObjectViewDelegate」協議聲明時,這顯然是有?1

#import "MyObjectAddView.h" 
#import "MyAppDelegate.h" 

#define myAppDelegate (MyAppDelegate *) [[UIApplication sharedApplication] delegate] 

@class MyObjectAddView; 

@interface AccountViewController : UIViewController <UIScrollViewDelegate, MyObjectAddViewDelegate, UIImagePickerControllerDelegate> { 

    MyObjectAddView *myAddView; 
    ..... 
} 

@property (nonatomic, retain) IBOutlet MyObjectAddView *myAddView; 

- (id) initWithSettings:(SettingsObject *)settings; 

@end 

爲什麼會突然告訴我,這找不到協議聲明「MyObjectAddViewDelegate」當我明確導入幷包含@class的協議定義在哪裏?這裏怎麼MyObjectAddView設置:

#import <UIKit/UIKit.h> 
#import "MyAppDelegate.h" 

#define myAppDelegate (MyAppDelegate *) [[UIApplication sharedApplication] delegate] 

@protocol MyObjectAddViewDelegate; 

@interface MyObjectAddView : UIView <UITextFieldDelegate> { 

@private 
    id <MyObjectAddViewDelegate> delegate; 
    ....  
@public 
    ..... 
} 

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

@end 

@protocol MyObjectAddViewDelegate <NSObject> 
// expense == nil on cancel 
- (void)myObjectAddViewDidFinish:(MyObjectAddView *)addView; 

@end 

一切似乎完美的設置,我沒有看到任何圓形進口?!任何建議,爲什麼它可能不會在MyObjectAddView中看到協議定義?

謝謝。

+0

檢查包含的文件。
這是兩個相互包含的標題的症狀。
有時會導致此錯誤。 – skywinder 2013-10-06 18:04:00

回答

8

在導入該類的標題後,不需要對類進行前向引用。只有在您計劃在實現文件中包含頭文件時,纔會執行前向引用。刪除@class MyObjectAddView,如果修復它,讓我知道如果不是,我可能有另一種解決方案給你。

+0

我需要前向引用,否則它在MyObjectAddView * myAddView'行上崩潰,並在MyObjectAddView_之前說明_expected specifier-qualifier-list,我不知道它是什麼意思。如果我也包含前向引用,那麼這個錯誤就會消失。因此刪除它並不能解決問題。刪除它仍然說它無法找到協議聲明。嗯 – 2011-03-24 20:31:19

+0

這似乎很奇怪。可能還有其他事情正在進行。我猜你的第二個代碼示例是MyObjectAddView.h,如果是這種情況,你不應該在第一個代碼示例中包含前向聲明,因爲你明確地導入它。儘管頭文件在您的項目中,但它可能位於不正確的目錄中,因此不在標頭搜索路徑中。 – Joe 2011-03-24 20:36:24

+2

問題已解決。我說沒有周期性的進口,但實際上在所有類中都有#import「MyAppDelegate.h」。問題解決了。感謝您在需要時啓用@class而不是。 – 2011-03-24 20:57:04

6

綜合討論:另一種解決方案是檢查委託實現和協議聲明之間的循環導入。這解決了我的問題。

相關問題