0 votes

Comment puis-je utiliser la valeur de retour d'une feuille de calcul pour décider de fermer ou non une fenêtre?

Je veux utiliser windowShouldClose: dans ma sous-classe NSWindowController pour afficher une feuille demandant à l'utilisateur s'il veut enregistrer les modifications avant de fermer avec les boutons Enregistrer, Annuler et Ne pas enregistrer.

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

Je peux renvoyer NO dans windowShouldClose:, mais alors lorsque j'envoie [self close] au contrôleur dans le délégué de la feuille, rien ne se passe.

Est-ce que quelqu'un peut m'expliquer comment faire cela ou me donner un exemple de code à suivre?

2voto

NilObject Points 7874

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

Enfin, dans la méthode windowShouldClose, retournez la valeur du drapeau.

2voto

Lawrence Johnston Points 9723

Ceci est le code que j'ai finalement utilisé.

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

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

- (BOOL)windowShouldClose:(id)window {    
  if (windowShouldCloseAfterSaveSheet_) {
    // L'utilisateur a déjà passé par la feuille de sauvegarde et a choisi de fermer la fenêtre
    windowShouldCloseAfterSaveSheet_ = NO; // Réinitialiser la valeur au cas où
    return YES;
  }

  if ([properties_ settingsChanged]) {
    NSAlert *saveAlert = [[NSAlert alloc] init];
    [saveAlert addButtonWithTitle:@"OK"];
    [saveAlert addButtonWithTitle:@"Annuler"];
    [saveAlert addButtonWithTitle:@"Ne pas enregistrer"];
    [saveAlert setMessageText:@"Enregistrer les changements apportés aux préférences?"];
    [saveAlert setInformativeText:@"Si vous ne sauvegardez pas les modifications, elles seront perdues"];
    [saveAlert beginSheetModalForWindow:window
                                modalDelegate:self
                               didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) 
                                  contextInfo:nil];

    return NO;
  }

  // Les paramètres n'ont pas été modifiés.
  return YES;
}

// Ceci est la méthode qui est appelée lorsque l'utilisateur a choisi une option dans la feuille de sauvegarde des préférences.
- (void)alertDidEnd:(NSAlert *)alert 
         returnCode:(int)returnCode
        contextInfo:(void *)contextInfo {
  switch (returnCode) {
    case NSAlertFirstButtonReturn:
      // Bouton Enregistrer
      if (![properties_ saveToFile]) {
        NSAlert *saveFailedAlert = [NSAlert alertWithMessageText:@"Échec de l'enregistrement"
                                                   defaultButton:@"OK"
                                                 alternateButton:nil
                                                     otherButton:nil
                                       informativeTextWithFormat:@"Impossible d'enregistrer les préférences sur le disque"];
        [saveFailedAlert runModal];
      }
      [[alert window] orderOut:self];
      windowShouldCloseAfterSaveSheet_ = YES;
      [[self window] performClose:self];
      break;
    case NSAlertSecondButtonReturn:
      // Bouton Annuler
      // Ne rien faire
      break;
    case NSAlertThirdButtonReturn:
      // Bouton Ne pas enregistrer
      [[alert window] orderOut:self];
      windowShouldCloseAfterSaveSheet_ = YES;
      [[self window] performClose:self];
      break;
    default:
      NSAssert1(NO, @"Renvoi de bouton inconnu : %i", returnCode);
      break;
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X