2009-06-12 8 views
0

Je souhaite utiliser windowShouldClose: dans ma sous-classe NSWindowController pour afficher une feuille demandant si l'utilisateur souhaite enregistrer les modifications avant de les fermer avec les boutons Enregistrer, Annuler et Ne pas enregistrer.Comment utiliser la valeur de retour d'une feuille pour décider de fermer ou non une fenêtre?

Le problème auquel je suis confronté est que beginSheetModalForWindow:... utilise un délégué au lieu d'une valeur de retour.

Je peux retourner NO dans windowShouldClose:, mais alors quand j'envoie [self close] au contrôleur dans le délégué du panneau rien ne se passe. Est-ce que quelqu'un peut m'expliquer comment faire ceci ou me diriger dans la direction d'un exemple de code?

Répondre

2

La solution de base consiste à placer un indicateur booléen sur la fenêtre indiquant si la fenêtre a averti ou non des modifications non enregistrées. Avant d'appeler [self close], définissez ce drapeau sur true.

Enfin, dans la méthode windowShouldClose, renvoyez la valeur de l'indicateur.

+0

Merci, cela a du sens. Voir ma réponse pour le code exemple en utilisant ce modèle. –

2

C'est le code que j'ai fini par utiliser.

windowShouldCloseAfterSaveSheet_ est une variable d'instance dans ma classe de contrôleur.

N'oubliez pas de régler la sortie de la fenêtre pour le contrôleur dans IB.

- (BOOL)windowShouldClose:(id)window {  
    if (windowShouldCloseAfterSaveSheet_) { 
    // User has already gone through save sheet and choosen to close the window 
    windowShouldCloseAfterSaveSheet_ = NO; // Reset value just in case 
    return YES; 
    } 

    if ([properties_ settingsChanged]) { 
    NSAlert *saveAlert = [[NSAlert alloc] init]; 
    [saveAlert addButtonWithTitle:@"OK"]; 
    [saveAlert addButtonWithTitle:@"Cancel"]; 
    [saveAlert addButtonWithTitle:@"Don't Save"]; 
    [saveAlert setMessageText:@"Save changes to preferences?"]; 
    [saveAlert setInformativeText:@"If you don't save the changes, they will be lost"]; 
    [saveAlert beginSheetModalForWindow:window 
           modalDelegate:self 
           didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) 
            contextInfo:nil]; 

    return NO; 
    } 

    // Settings haven't been changed. 
    return YES; 
} 

// This is the method that gets called when a user selected a choice from the 
// do you want to save preferences sheet. 
- (void)alertDidEnd:(NSAlert *)alert 
     returnCode:(int)returnCode 
     contextInfo:(void *)contextInfo { 
    switch (returnCode) { 
    case NSAlertFirstButtonReturn: 
     // Save button 
     if (![properties_ saveToFile]) { 
     NSAlert *saveFailedAlert = [NSAlert alertWithMessageText:@"Save Failed" 
                defaultButton:@"OK" 
               alternateButton:nil 
                otherButton:nil 
             informativeTextWithFormat:@"Failed to save preferences to disk"]; 
     [saveFailedAlert runModal]; 
     } 
     [[alert window] orderOut:self]; 
     windowShouldCloseAfterSaveSheet_ = YES; 
     [[self window] performClose:self]; 
     break; 
    case NSAlertSecondButtonReturn: 
     // Cancel button 
     // Do nothing 
     break; 
    case NSAlertThirdButtonReturn: 
     // Don't Save button 
     [[alert window] orderOut:self]; 
     windowShouldCloseAfterSaveSheet_ = YES; 
     [[self window] performClose:self]; 
     break; 
    default: 
     NSAssert1(NO, @"Unknown button return: %i", returnCode); 
     break; 
    } 
} 
Questions connexes