2012-01-10 35 views
17

Tôi khá mới với mục tiêu c và có một số vấn đề cơ bản.tên loại không xác định trong mục tiêu c

Tôi đã viết một chương trình đơn giản sử dụng trình điều hướng và mọi thứ hoạt động tốt. sau đó tôi đã thêm vài dòng mã (thậm chí không thể nhớ chính xác và dường như không có kết nối với sự cố) và sự cố đã xảy ra. Tôi cố gắng ctrl + z, và vấn đề vẫn:

tôi chạy chương trình và nhận được các lỗi này:

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

khi mainController là màn hình đầu tiên được nạp.

Đây là tập tin 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 

này là phần có liên quan của tập tin 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; 
} 

Và đây là 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 

nó đã hoạt động ...
bạn có thể tìm ra?

cảm ơn

+3

Hiện chúng tôi 'mainController. h' làm ơn. – mattjgalloway

+0

Có một lớp được định nghĩa với tên 'mainController' không? –

+0

Tôi đã thêm mainController.h để bạn có thể xem nó cũng –

Trả lời

16

Sự cố này xảy ra với tôi một lần.

tôi đã nhập khẩu "APPDelegate.h" trong tập tin h của tôi và trong APPDelegate.h của tôi, tôi đã nhập khẩu các tập tin quá (nó không phải là một vấn đề nhưng ...)

Những gì tôi đã làm: tôi đã thay đổi khẩu từ .h của riêng tôi để .m và nó làm việc :)

+3

Ngoài câu trả lời này. Trong trường hợp nếu bạn cần phải có loại đó trong tiêu đề của bạn nhưng muốn tránh chu kỳ nhập, chỉ cần sử dụng các khai báo chuyển tiếp. ví dụ: '@class mainController;' – jackal

-1

Vấn đề này trông giống như lỗi đánh máy vì tên lớp thường bắt đầu bằng ký tự chữ hoa. Do đó, mainController có thể/nên là MainController. Kiểm tra tên lớp để xem lỗi có thực sự là lỗi đánh máy hay không, bởi vì trình biên dịch cho bạn biết nó không thể tìm thấy bất kỳ lớp nào được gọi là mainController.

+0

không ... nó được viết chính xác. như tôi đã nói - nó đã hoạt động –

0

Kiểm tra mục tiêu và tệp đang được biên dịch. Có lẽ mainController có một số cách bị loại bỏ khỏi mục tiêu đó. Nếu vậy, khi xây dựng, bạn sẽ nhận được thông báo rằng nó không thể được tìm thấy.

34

tôi đã tìm ra, đó là những lỗi tương tự xuất hiện nếu bạn có một chu kỳ nhập:

Class_A.h: #import "Class_B.h"

Class_B.h: #import "Class_A.h"

Để khắc phục: tìm bất kỳ lần nhập nào của lớp vi phạm (tab lỗi là bạn của bạn, hãy mở rộng lỗi có liên quan cho danh sách nhập). Xóa #import 's phù hợp

+0

điều này thực sự là vấn đề của tôi. cảm ơn – pnizzle

+0

thx ... đã giải quyết được sự cố của tôi! – iOSDev

0

@JustAStranger và @NathanielSymer, cả hai đều chính xác!

Dù sao, đáng nhớ rằng trường hợp này, dưới đây, có cùng một vấn đề quá:

Class_A.h: #import "Class_B.h"

hạng_B.h: #import "Class_C.h"

Class_C.h: #import "Class_A.h"

Vấn đề này tiết lộ cho chúng ta như thế nào quan trọng là chăm sóc về chủ sở hữu tại các mối quan hệ lớp của chúng tôi. Rất dễ dàng tạo ra các vấn đề về chu kỳ sử dụng các tiêu đề ObjC.

1

Như những người khác đã đề cập, điều này thực sự là do nhập khẩu tuần hoàn. Để khắc phục điều này, hãy xóa các mục nhập trong một trong các lớp. Nhưng đôi khi điều này là không đủ. Nếu các lớp phụ thuộc vào nhau, chỉ cần phía trước-khai báo một lớp trong khác:

Class A:

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

@interface A: NSObject 

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

Trong lớp B ta có:

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

@property(nonatomic, strong) A *a; 
Các vấn đề liên quan