неизвестное имя типа в цели c - PullRequest
18 голосов
/ 10 января 2012

Я довольно плохо знаком с задачей 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

это уже сработало ...Вы можете понять это?

спасибо

Ответы [ 6 ]

35 голосов
/ 28 мая 2012

Я понял, что такая же ошибка появляется, если у вас есть цикл импорта:

Class_A.h: #import "Class_B.h"

Class_B.h: #import "Class_A.h"

Исправить: ищите любой импорт класса-нарушителя (вкладка ошибок - ваш друг, разверните соответствующую ошибку для списка импорта). Удалить #import соответственно

17 голосов
/ 23 мая 2012

Эта проблема случилась со мной однажды.

Я импортировал файл "APPDelegate.h" в свой файл h и в свой файл APPDelegate.h Я тоже импортировал файл (это не должно быть проблемой, но ...)

Что я сделал: я изменил Импорт с собственного .h на .m, и это сработало:)

3 голосов
/ 12 декабря 2016

Как уже упоминали другие, это действительно вызвано циклическим импортом. Чтобы исправить это, удалите импорт в одном из классов. Но иногда этого недостаточно. Если классы зависят друг от друга, просто объявите вперед один класс в другом:

Класс A:

#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;
1 голос
/ 20 марта 2014

@ JustAStranger и @NathanielSymer, оба являются правильными!

В любом случае, стоит помнить, что и в этом случае ниже тоже есть та же проблема:

Class_A.h: #import "Class_B.h"

Class_B.h: #import "Class_C.h"

Class_C.h: #import "Class_A.h"

Эта проблема показывает нам, как важно заботиться о владельцах в наших отношениях с Class.Очень просто создает проблемы цикла, используя заголовки ObjC.

0 голосов
/ 11 января 2012

Проверьте цель и файлы, которые она компилирует. Возможно, mainController каким-то образом был удален из этой цели. Если это так, при сборке вы получите сообщение о том, что его нельзя найти.

0 голосов
/ 10 января 2012

Эта проблема выглядит как опечатка, потому что имена классов обычно начинаются с заглавной буквы. Следовательно, mainController может / должен быть MainController. Проверьте имя класса, чтобы увидеть, действительно ли ошибка опечатка, потому что компилятор говорит вам, что он не может найти класс с именем mainController.

...