2010-05-26 5 views
0

Voici ce que j'essaie de faire. Je dois demander à l'utilisateur une invite de mot de passe et jusqu'à ce qu'il entre le mot de passe et frappe, dites le bouton Enter sur la feuille, je veux empêcher le code étant analysé en arrière-plan. Voici le code pour exécuter la feuille et lorsque l'utilisateur entre le mot de passe et frappe Enter, endSpeedSheet est exécuté. J'appelle tout cela de ma fonction Main().NSApp Sheets question dans le cacao

Ce que je remarque est que lorsque la fonction principale s'exécute, la feuille apparaît, l'utilisateur est invité à entrer un mot de passe. Mais en arrière-plan, je vois déjà que "Code arrive ici" a été lancé. Cela signifie que le code a déjà été exécuté en arrière-plan. Ce dont j'ai besoin, c'est que le code attende à l'invite du mot de passe, puis utilise ce mot de passe après que la feuille a été fermée. Une idée sur ce qui me manque ici? (Et merci d'avance :))

 - (IBAction) showSpeedSheet:(id)sender 
    { 

     [NSApp beginSheet:speedSheet 
    modalForWindow:(NSWindow *)window 
    modalDelegate:nil 
    didEndSelector:nil 
    contextInfo:nil]; 

    } 

    -(IBAction)endSpeedSheet:(id)sender 
    { 
joinPassword = [joinPasswordLabel stringValue]; 
[NSApp endSheet:speedSheet]; 
[speedSheet orderOut:sender]; 


    } 


    -(IBAction)main:(id)sender 
    { 
     [self showSpeedSheet:(id)sender]; 
     // More Code here 
     NSLog(@" Code gets here"); 

    } 

Répondre

1

La réponse est simple: ne mettez pas le code qui doit courir après la feuille complète directement après l'appel -showSpeedSheet:. Les feuilles sont asynchrones, vous devez donc factoriser votre code pour qu'il ne soit appelé qu'une fois la feuille terminée.

C'est ce que le paramètre didEndSelector dans la méthode ‑beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo: est pour. Vous passez dans un sélecteur à appeler lorsque la feuille est fermée. Dans l'objet délégué modal, vous implémentez ce sélecteur et effectuez le traitement qui doit être effectué une fois la feuille terminée.

- (IBAction) showSpeedSheet:(id)sender 
{ 
    [NSApp beginSheet:speedSheet 
     modalForWindow:self.window 
     modalDelegate:self 
     didEndSelector:@selector(speedSheetDidEnd:returnCode:contextInfo:) 
      contextInfo:nil]; 
} 


- (IBAction)endSpeedSheet:(id)sender 
{ 
    self.joinPassword = [joinPasswordLabel stringValue]; 
    [NSApp endSheet:speedSheet]; 
    [speedSheet orderOut:sender]; 
} 

- (void)speedSheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo 
{ 
    if(sheet == speedSheet) 
    { 
     //the sheet has ended, so do something 
    } 
} 
+0

Merci Rob. Cela a beaucoup aidé. Je l'ai fonctionné maintenant. Pour tous ceux qui trébuchent sur ce lien, regardez ça aussi. Je l'ai trouvé utile: http://etutorials.org/Programming/Cocoa/Part+I+Introducing+Cocoa/Chapter+3.+The+Application+Kit/3.6+Sheets/ – cocoacoder