2012-01-10 130 views
17

我對目標c很陌生,並且遇到一些基本問題。目標c中的未知類型名稱

我用導航器寫了一個簡單的程序,一切正常。 然後我添加了幾行代碼(甚至不記得是什麼,它似乎沒有連接到問題),並出現問題。我試着CTRL + Z和問題還存在:

我運行該程序,並得到這些錯誤:

1. unknown type name "mainController" 
2. property with 'retain (or strong)' attribute must be of object type 

而mainController要加載的第一個屏幕。

這是appDelegate.h文件:

#import <UIKit/UIKit.h> 
#import "mainController.h" 
#import "WishesList.h" 
#import "Wish.h" 

@interface AppDelegate : UIResponder <UIApplicationDelegate> 

@property (strong, nonatomic) UIWindow *window; 
@property (strong, nonatomic) IBOutlet UINavigationController *navController; 
@property (strong, nonatomic) IBOutlet mainController *viewController; // this line creates the errors 
@property (strong, nonatomic) WishesList *WishesArray; 
@property (strong, nonatomic) NSIndexPath *temp; 

@end 

這是appDelegate.m文件的相關部分:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 
    WishesArray = [[WishesList alloc]init]; 
    temp = nil; 
    [self setViewController:[[mainController alloc]init]]; 
    [self setNavController:[[UINavigationController alloc]initWithRootViewController:self.viewController]]; 
    [self.window setRootViewController:navController]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

這是mainController.h:

#import <UIKit/UIKit.h> 
#import "addWishController.h" 
#import "displayWish.h" 
#import "WishesList.h" 
#import "Wish.h" 

@interface mainController : UIViewController 

@property (nonatomic, weak) WishesList *list; 
@property (nonatomic, strong) IBOutlet UITableView *wishTable; 

- (void)addWish; 

@end 

它已經工作...
你能想出它嗎?

感謝

+3

顯示美國'mainController。請。 – mattjgalloway 2012-01-10 09:59:43

+0

是否有名稱爲'mainController'的類定義? – 2012-01-10 10:01:22

+0

我加mainController.h所以你可以看到它也 – 2012-01-10 10:26:07

回答

16

這個問題發生在我身上一次。

我在我的.h文件導入「APPDelegate.h」在我APPDelegate.h我導入的文件太(它不應該是一個問題,但...)

我做了什麼:我改變了進口從我自己的.h到.M和它的工作:)

+3

除了這個答案。如果您需要在報頭中使用該類型,但希望避免導入循環,則只需使用前向聲明即可。例如: '@class mainController;' – jackal 2015-07-05 15:07:07

-1

這個問題看起來像一個錯字,因爲類名稱通常以大寫字母開頭。因此,mainController可以/應該是MainController。檢查類名以查看錯誤是否確實是錯字,因爲編譯器告訴你它找不到任何名爲mainController的類。

+0

沒有...它正確地寫入。正如我所說 - 它已經工作 – 2012-01-10 10:06:00

0

檢查目標及其編譯的文件。也許mainController有一些如何從該目標中刪除。如果是這樣,當建設時,你會得到它無法找到的消息。

34

我想通了,如果你有一個導入週期出現了同樣的錯誤:

Class_A.h:#import "Class_B.h"

Class_B.h:#import "Class_A.h"

修復:查找任何導入的違規類(錯誤標籤是你的朋友,展開導入列表的相關錯誤)。刪除#import's據此

+0

這確實是我的問題。謝謝 – pnizzle 2012-09-20 01:51:09

+0

thx ...解決了我的問題! – iOSDev 2013-04-19 06:31:28

0

@JustAStranger和@NathanielSymer,都是正確的!

無論如何,值得記住,這種情況下,下面,有同樣的問題太多:

Class_A.h:#import "Class_B.h"

Class_B。H:#import "Class_C.h"

Class_C.h:#import "Class_A.h"

這個問題向我們揭示了多麼重要的是採取關心我們的階級關係的業主。使用ObjC頭文件很容易造成循環問題。

1

正如其他人所說,這確實是循環的進口造成的。要解決這個問題,請刪除其中一個類中的導入。但有時這是不夠的。如果類互相依賴,只需在對方前鋒,聲明一個類:一

類:

#import <UIKit/UIKit.h> 
@class B; //<- this is essential here 

@interface A: NSObject 

@property(nonatomic, strong) B *b; 
//... 

在B類有:

#import "A.h" 
@interface B: NSObject 

@property(nonatomic, strong) A *a;