2012-01-10 13 views
17

Sono piuttosto nuovo all'obiettivo c e ho alcuni problemi di base.nome di tipo sconosciuto nell'obiettivo c

Ho scritto un semplice programma utilizzando un navigatore e tutto ha funzionato bene. poi ho aggiunto poche righe di codice (non riesco nemmeno a ricordare cosa esattamente, e sembra non avere alcuna connessione al problema) e il problema si è verificato. Ho provato Ctrl + z, e il problema rimasto:

corro il programma e ottengo questi errori:

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

mentre MainController è la prima schermata da caricare.

Questo è il file 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 

questa è la parte rilevante del file 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; 
} 

E questo è 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 

ha già funzionato ...
puoi capirlo?

grazie

+3

Mostraci 'MainController. per favore. – mattjgalloway

+0

Esiste una classe definita con il nome 'mainController'? –

+0

Ho aggiunto mainController.h così puoi vederlo anche –

risposta

16

Questo problema mi capita una volta.

stavo importando il "APPDelegate.h" nel mio file h e nel mio APPDelegate.h mi è stato importato il file troppo (non dovrebbe essere un problema, ma ...)

Quello che ho fatto: ho cambiato l'importazione dalla mia .h a .m e ha funzionato :)

+3

in aggiunta a questa risposta. Nel caso in cui se hai bisogno di avere quel tipo nella tua intestazione ma vuoi evitare cicli di importazione, usa semplicemente le dichiarazioni di inoltro. ad es .: '@class mainController;' – jackal

-1

Questo problema sembra un errore di battitura perché i nomi delle classi di solito iniziano con un carattere maiuscolo. Pertanto, mainController potrebbe/dovrebbe essere MainController. Controlla il nome della classe per vedere se l'errore è effettivamente un refuso, perché il compilatore ti sta dicendo che non può trovare alcuna classe chiamata mainController.

+0

no ... è scritto correttamente. come ho detto - ha già funzionato –

0

Controllare la destinazione ei file che sta compilando. Forse mainController ha un po 'come è stato rimosso da quel target. Se è così, quando costruisci, otterrai il messaggio che non può essere trovato.

34

ho capito, che lo stesso errore viene visualizzato se si dispone di un import-ciclo:

Class_A.h: #import "Class_B.h"

Class_B.h: #import "Class_A.h"

Per risolvere: cercare eventuali importazioni della classe in errore (la scheda di errore è di vostro amico, espandere l'errore pertinente per un elenco di importazioni). Rimuovi #import di conseguenza

+0

questo è davvero il mio problema. grazie – pnizzle

+0

thx ... ha risolto il mio problema! – iOSDev

0

@JustAStranger e @NathanielSymer, entrambi sono corretti!

In ogni caso, vale la pena ricordare che questo caso, al di sotto, ha lo stesso problema troppo:

Class_A.h: #import "Class_B.h"

classe_B.h: #import "Class_C.h"

Class_C.h: #import "Class_A.h"

Questo problema ci rivelano quanto sia importante prendersi cura sui proprietari presso i nostri rapporti di classe. È molto facile creare problemi di ciclo usando le intestazioni ObjC.

1

Come altri hanno menzionato, questo è effettivamente causato dalle importazioni cicliche. Per risolvere questo problema rimuovere le importazioni in una delle classi. Ma a volte questo non è sufficiente. Se le classi dipendono l'uno dall'altro, semplicemente avanti dichiarare l'una classe in un altro:

Classe A:

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

@interface A: NSObject 

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

In classe B in cui siamo:

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

@property(nonatomic, strong) A *a; 
Problemi correlati