2012-02-06 35 views
2

我包括像這樣的文件訪問:Import指令不能給人以類

#import "BannerPhoneContentController.h" 
然而

,當我嘗試使用這樣的:

bannerContentController = [[BannerPhoneContentController alloc] init]; 

我得到的錯誤:

Use of undeclared identifier 'BannerPhoneContentController'; 

什麼可能導致代碼看似忽略我的導入?

這是標題內容控制器的標題。

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 

#import "BannerContentController.h" 

@interface BannerPhoneContentController : BannerContentController <UIScrollViewDelegate> 
{ 
    UIScrollView *scrollView; 
    UIPageControl *pageControl; 
    NSMutableArray *viewControllers; 

    // To be used when scrolls originate from the UIPageControl 
    BOOL pageControlUsed; 
} 

@property (nonatomic, retain) UIScrollView *scrollView; 
@property (nonatomic, retain) UIPageControl *pageControl; 

@property (nonatomic, retain) NSMutableArray *viewControllers; 

- (IBAction)changePage:(id)sender; 

@end 

EDIT bannerContentController是類型BannerContentController NOT BannerPhoneContentController的。後者是前者的亞型。絕對值得注意的是,這個確切的代碼在另一個應用程序中工作得很好,所以它與代碼本身無關 - 只是顯然包含了代碼。我很難過。

編輯確定發現問題 - 不知道如何解決它。我生成的預處理文件,它包含頭文件,其實是這樣的:

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 

#import "ContentController.h" 

@interface PhoneContentController : ContentController <UIScrollViewDelegate> 
{ 
    UIScrollView *scrollView; 
    UIPageControl *pageControl; 
    NSMutableArray *viewControllers; 

    // To be used when scrolls originate from the UIPageControl 
    BOOL pageControlUsed; 
} 

@property (nonatomic, retain) UIScrollView *scrollView; 
@property (nonatomic, retain) UIPageControl *pageControl; 

@property (nonatomic, retain) NSMutableArray *viewControllers; 

- (IBAction)changePage:(id)sender; 

@end 

注意區別 - 所有的「旗幟的缺失。這是該文件過去的樣子。但是,我已經檢查過,項目中的文件是我在頂部發布的文件。我嘗試清理解決方案並重新構建。我該如何解決這個問題,爲什麼發生這種情況?

編輯我包含所有這些內容的文件是代碼庫的一部分。我現在已經創建了一個新項目,導入了代碼庫,並再次以完全相同的方式將所有這些內容包含在該庫中。它的工作原理。我查看了兩個項目,所涉及的代碼是相同的。這必須是一個項目設置?

回答

1

它尋找我喜歡遞歸導入。說,BannerContentController.h進口BannerPhoneContentController.hBannerPhoneContentController.h進口BannerContentController.h

如果是這樣,那麼你應該解決遞歸依賴關係。例如。使用前向聲明。

+0

其實我已向前聲明BannerContentController在.h和在.M進口BannerPhoneContentController。而且這與其他應用程序的結構相同。 – SirYakalot 2012-02-06 14:35:38

+0

如果你正在使用新的xcode,那麼你可以檢查預處理文件(「產品」菜單項iirc) – Yuras 2012-02-06 14:39:23

+0

如果我轉發declare BannerPhoneContentController我得到 - 語義問題:從不兼容的類型'BannerPhoneContentController *'分配到'BannerContentController *',但怎麼可以這是什麼時候BannerPhoneContentController直接從BannerContentController繼承? – SirYakalot 2012-02-06 14:40:24

0

確實使用@class BannerPhoneContentController in .h和#import "BannerPhoneContentController.h" in .m給出了相同的結果?

+0

我得到了 - Receiver'BannerPhoneContentController'是一個前向類,相應的@interface可能不存在 – SirYakalot 2012-02-06 14:30:03

+0

在.h文件中同時使用'#import'和'@ class'在過去幫助我處理接收器警告。這對我的情況有什麼幫助嗎? – iNoob 2012-02-06 14:33:41

+0

我得到了 - 語義問題:從不兼容的類型'BannerContentController *'分配BannerPhoneContentController *'但是當BannerPhoneContentController直接從BannerContentController繼承時,這怎麼可能? – SirYakalot 2012-02-06 14:39:59

0

經過大量的搞亂之後,感謝Yuras的評論,我生成了預處理代碼,並意識到問題在於代碼的舊版本被包含在內。

更有用的是爲什麼。這只是XCode中的一個錯誤,有時會在增量鏈接打開時發生 - 基本上,這是通過在代碼的相應位已被更改時僅更改預處理文件的各個部分來節省時間的地方。不幸的是,這並不總是正常工作。

該解決方案煩人地是刪除文件,清理構建,刪除派生數據(窗口/ oraniser /項目/項目名稱/刪除派生數據),重新啓動xcode(可能也重新啓動您的計算機,或扔它窗外併購買一個新的)然後重新導入這些文件。

的XCode可以是一個真正的痛苦...