2012-01-10 12 views
17

Soy bastante nuevo para el objetivo c, y tengo algunos problemas básicos.nombre de tipo desconocido en el objetivo c

Escribí un programa simple usando un navegador, y todo funcionó bien. luego agregué algunas líneas de código (ni siquiera recuerdo qué exactamente, y parece que no tiene conexión con el problema) y ocurrió el problema. He intentado ctrl + z, y el problema seguía siendo:

corro el programa y obtener estos errores:

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

mientras mainController es la primera pantalla que se va a cargar.

Este es el archivo 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 

esta es la parte relevante del archivo 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; 
} 

Y esto es 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 

ya funcionó ...
¿Puedes averiguarlo?

gracias

+3

Muéstranos 'mainController. h' por favor. – mattjgalloway

+0

¿Hay una clase definida con el nombre 'mainController'? –

+0

He añadido mainController.h para que pueda verlo también –

Respuesta

16

Este problema me ha ocurrido una vez.

me importaba el "APPDelegate.h" en mi archivo h y en mi APPDelegate.h estaba importando el archivo también (que no debería ser un problema, pero ...)

Lo que hice: he cambiado la importación de mi propia .h a .m y funcionó :)

+3

Además de esta respuesta. En caso de que necesite tener ese tipo en su encabezado pero quiera evitar los ciclos de importación, simplemente use las declaraciones de reenvío. e.g .: '@class mainController;' – jackal

-1

Este problema se ve como un error porque los nombres de clase por lo general comienzan con una mayúscula. Por lo tanto, mainController podría/debería ser MainController. Compruebe el nombre de la clase para ver si el error es realmente un error tipográfico, porque el compilador le dice que no puede encontrar ninguna clase llamada mainController.

+0

no ... está escrito correctamente. como dije, ya funcionó –

0

Compruebe el destino y los archivos que está compilando. Tal vez mainController haya sido eliminado de ese objetivo. Si es así, al construir, recibirás el mensaje de que no se puede encontrar.

34

me di cuenta de que aparece el mismo error si tiene un ciclo de importación:

Class_A.h: #import "Class_B.h"

Class_B.h: #import "Class_A.h"

Para corregir: busque cualquier importación de la clase ofensiva (la pestaña de error es su amigo, expanda el error correspondiente para obtener una lista de las importaciones). Elimine #import en consecuencia

+0

Este es mi problema. gracias – pnizzle

+0

thx ... resuelto mi problema! – iOSDev

0

@JustAStranger y @NathanielSymer, ¡ambos son correctos!

De todos modos, vale la pena recordar que este caso, a continuación, tiene el mismo problema:

Class_A.h: #import "Class_B.h"

clase_B.h: #import "Class_C.h"

Class_C.h: #import "Class_A.h"

Este problema nos revelan lo importante es tener cuidado acerca de propietarios en nuestras relaciones de clase. Es muy fácil crear problemas de ciclo usando encabezados ObjC.

1

Como han mencionado otros, esto es causado por importaciones cíclicas. Para solucionar esto, elimine las importaciones en una de las clases. Pero a veces esto no es suficiente. Si las clases dependen unos de otros, simplemente con visión de declarar la clase en la otra:

Clase A:

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

@interface A: NSObject 

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

En la clase B tenemos:

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

@property(nonatomic, strong) A *a; 
Cuestiones relacionadas