web-dev-qa-db-fra.com

nom de type inconnu dans l'objectif c

Je suis assez nouveau pour Objective C et j'ai quelques problèmes de base.

J'ai écrit un programme simple en utilisant un navigateur, et tout a bien fonctionné. Puis j'ai ajouté quelques lignes de code (je ne me souviens même pas de quoi exactement, et il semble n'avoir aucun lien avec le problème) et le problème est survenu . J'ai essayé ctrl + z, et le problème est resté:

Je lance le programme et reçois ces erreurs:

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

mainController est le premier écran à être chargé.

C'est le fichier 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

voici la partie pertinente du fichier 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;
}

Et c'est 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

cela a déjà fonctionné ...
pouvez-vous comprendre?

merci

17
Amit Hagin

Ce problème m'est arrivé une fois.

J'importais le fichier "APPDelegate.h" dans mon fichier h et dans mon APPDelegate.h, j'importais aussi le fichier (cela ne devrait pas poser de problème, mais ...)

Ce que j'ai fait: j'ai changé l'importation de mon propre .h en .m et cela a fonctionné :)

17
João Nunes

J'ai compris que la même erreur apparaît si vous avez un cycle d'importation:

Classe_A.h: #import "Class_B.h"

Class_B.h: #import "Class_A.h"

Pour résoudre ce problème: recherchez les importations de la classe incriminée (l'onglet d'erreur est votre ami, développez l'erreur pertinente pour une liste d'importations). Supprimer le #import en conséquence

35
JustAStranger

Comme d'autres l'ont mentionné, cela est en effet causé par les importations cycliques. Pour résoudre ce problème, supprimez les importations dans l'une des classes. Mais parfois, cela ne suffit pas. Si les classes dépendent les unes des autres, il suffit de déclarer en avant l'une des classes dans l'autre:

Classe A:

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

@interface A: NSObject

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

En classe B on a:

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

@property(nonatomic, strong) A *a;
3
Tash Pemhiwa

@JustAStranger et @NathanielSymer, les deux sont corrects!

Quoi qu'il en soit, rappelons que ce cas, ci-dessous, présente également le même problème:

Classe_A.h: #import "Class_B.h"

Class_B.h: #import "Class_C.h"

Classe_C.h: #import "Class_A.h"

Ce problème nous révèle à quel point il est important de prendre soin des propriétaires dans nos relations de classe. Est très facile crée des problèmes de cycle en utilisant les en-têtes ObjC.

1
seufagner

Vérifiez la cible et les fichiers qu'il compile. Peut-être mainController a-t-il été supprimé de cette cible. Si tel est le cas, lors de la construction, vous obtiendrez le message qu'il est impossible de le trouver.

0
drekka