2010-08-14 5 views
4

Je suis nouveau sur Cocoa, et j'expérimente simplement avec la création d'une fenêtre par programme (sans utiliser Interface Builder).problèmes avec la création d'un NSWindow

Je lance une nouvelle application Cocoa dans Xcode, puis j'enlève la fenêtre du fichier nib dans Interface Builder pour la remplacer par la mienne.

Dans la fonction principale, j'ajouter le code:

NSWindow* myWindow; 

myWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect(10,100,400,300) 
    styleMask:NSTitledWindowMask 
    backing:NSBackingStoreBuffered 
    defer:NO]; 

Lorsque je tente de construire et exécuter l'application, je reçois le message d'erreur suivant:

Erreur (1002) la création CGSWindow

Pourquoi cela se produit-il ??? Qu'est-ce qu'une CGSWindow en passant?

Rainer

Répondre

2

Vous n'avez probablement pas une connexion au serveur de fenêtres encore. C'est le travail de NSApplication, alors essayez d'abord de créer le shared application.

Si cela ne fonctionne pas, je venais de passer avec mon habituelle mise en page de l'application: Création d'une sous-classe NSObject pour un contrôleur personnalisé, instancier ce de applicationWillFinishLaunching: de votre délégué de l'application et le libérer dans applicationWillTerminate:, et que votre contrôleur personnalisé de init méthode créer la fenêtre. L'objet application va certainement tourner à ce point (comme main ne fait rien mais appelle NSApplicationMain, qui obtient/crée l'application partagée et lui dit de fonctionner), donc vous devriez avoir votre connexion au serveur de fenêtre et ainsi être capable de créer la fenêtre.

0

Déplacer le code que vous avez écrit dans la méthode suivante à partir du fichier de mise en œuvre délégué App -

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
// Insert code here to initialize your application 

NSWindow* myWindow; 

myWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect(10,100,400,300) 
      styleMask:NSTitledWindowMask 
      backing:NSBackingStoreBuffered 
       defer:NO]; 
} 

et il devrait charger votre fenêtre parfaitement.

Il est à noter qu'il n'est jamais sûr et n'est pas une bonne habitude de créer des objets liés à l'interface utilisateur dans votre fonction main.

-1

Si vous souhaitez afficher une fenêtre complètement vide à partir de zéro tout cela est le code que vous aurez besoin:

//if you used a template this will be already in the file: 
int main(int argc, char *argv[]) 
{ 
NSAutoreleasePool *pool = [[NSAutoReleasePool alloc] init]; 
    int retval=UIApplicationMain(argc,argv,nil,@"SimpleWindowAppDelegate"); 
    [pool release]; 
    return retVal; 
} 

@implementation SimpleWindowAppDelegate : NSObject <UIApplicationDelegate> 
-(void) applicationDidFinishLaunching:(UIApplication *)application 
{ 
    UIWindow *window=[[UIWindow alloc] initWithFrame:[[UIDevice mainScreen] bounds]]; 
    //You could create views and add them here: 
    //UIView *myView=[[UIView alloc] initWithFrane:CGRectMake(0,0,50,50)]; 
    //[window addSubView:myView]; 
    //[myView release]; 
    [window makeKeyAndVisible]; 
} 
@end 
+0

L'OP demande spécifiquement au sujet NSWindow; pourquoi fournissez-vous un exemple iOS? De même, 'NSApplicationMain()' - contrairement à 'UIApplicationMain()', vous ne laissez pas passer votre propre classe principale et votre délégué d'application. – lowell

+0

Vrai, je me suis trompé, désolé – Leg10n

0

Le seul code que vous voudrez probablement jamais avoir dans votre fonction main() une application Cocoa est automatiquement créée pour vous par XCode (si vous l'utilisez).

Je suggère que vous ajoutez le code que vous voulez dans votre -applicationDidFinishLaunching de applicationDelegate: Méthode

- (void) applicationDidFinishLaunching:(NSNotification *)aNotification { 
    myWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect(10,100,400,300) 
     styleMask:NSTitledWindowMask 
     backing:NSBackingStoreBuffered 
     defer:NO];; 
} 
Questions connexes