2012-05-23 7 views
4

Je l'ai décomposé en un très petit projet. En utilisant le code suivant dans le délégué de l'application:Cocoa: Affichage d'une erreur après que NSApp beginSheet aboutisse à la fenêtre principale

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    TestingWindowController * testingWindowController = [[TestingWindowController alloc] initWithWindowNibName: @"TestingWindowController"]; 

    // Begin our sheet 
    [NSApp beginSheet: testingWindowController.window 
     modalForWindow: self.window 
     modalDelegate: self 
     didEndSelector: @selector(windowDidEnd:returnCode:contextInfo:) 
      contextInfo: NULL]; 
} 

- (void)windowDidEnd:(id)alert returnCode:(NSInteger)returnCode contextInfo:(id) contextInfo 
{ 
    // If the user did not accept, then we really don't care what else they did! 
    if (returnCode != NSOKButton) return; 

    // We have had an error. Display it. 
    [[NSApplication sharedApplication] presentError: nil 
            modalForWindow: self.window 
              delegate: nil 
           didPresentSelector: nil 
             contextInfo: NULL]; 
} 

Et l'action suivante liée à bouton sur la pointe des fenêtres. (Notez que la fenêtre de la plume est également configurée pour ne pas être visible au lancement).

- (IBAction) onClose: (id) sender 
{ 
    [[NSApplication sharedApplication] endSheet: self.window 
            returnCode: NSOKButton]; 

    [self.window orderOut: nil];  
} // End of onClose 

Ce qui finit par se produire est, une fois que je les onClose fonctionne, toutes les fenêtres disparaissent et je suis resté avec rien, mais la boîte de dialogue d'erreur (la fenêtre principale a disparu). Error dialog with no main window

Y at-il un problème avec mon code? Pourquoi ma fenêtre principale disparaît-elle?

REMARQUE: Je sais que je ne transmets pas d'erreur à la méthode presentError. J'ai délibérément laissé cette null car je n'ai eu que peu de temps pour écrire l'exemple de code. Passer une erreur réelle entraîne le même comportement. Un exemple de projet est disponible here.

Répondre

1

Vous utilisez 2 méthodes pour ouvrir votre fenêtre, beginSheet: ..... et runModalForWindow :. Vous avez seulement besoin d'un de ceux-là. Si vous voulez une feuille attachée à votre fenêtre, utilisez la première méthode, si vous voulez une fenêtre autonome, utilisez la seconde. De même, dans votre méthode onClose, vous devriez utiliser endSheet: returnCode: si vous fermez une feuille (l'argument de cette méthode devrait être testingWindowController.window not self.window), et stopModalWithCode: si vous fermez une fenêtre modale, vous ne devriez pas avoir les deux.

+0

Merci , mais malheureusement, cela n'a pas résolu le problème. J'ai essayé d'utiliser les méthodes 'beginSheet' et' endSheet' mais j'ai toujours rencontré la même chose. (La fenêtre principale disparaît). – Kyle

+0

@Zenox: Votre code édité montre toujours que vous fermez la mauvaise fenêtre dans la méthode onClose - testingWindowController.window est la feuille que vous voulez terminer et ne pas commander self.window – rdelmar

+0

La méthode onClose est dans TestingWindowController (son le sélecteur pour un bouton cliquez sur le panneau). Donc self.window serait correct dans ce contexte, n'est-ce pas? – Kyle

4

On dirait que vous utilisez encore l'ancien api, essayez le nouveau

(déselectionner toujours visible au lancement de la fenêtre UserLoginWindowController)

- (IBAction)userButtonPressed:(id)sender { 

    UserLoginWindowController * wc = [UserLoginWindowController new]; 
    // we keep a reference, so the WC doesn't deallocate 
    self.modalWindowController = wc; 

    [[self window] beginSheet:[wc window] completionHandler:^(NSModalResponse returnCode) { 
     self.modalWindowController = nil; 
    }]; 

} 

dans le UserLoginWindowController

- (IBAction)cancelButtonPressed:(id)sender { 

    [[[self window] sheetParent] endSheet:[self window] returnCode:NSModalResponseCancel]; 

} 
+0

Oui. La nouvelle API basée sur les blocs vous évitera beaucoup de maux de tête. Le 10.10, vous pouvez également utiliser des storyboards pour le rendre plus simple. (Si vous voulez sauter dans cela encore) – uchuugaka

Questions connexes