2010-12-01 12 views
1

Je veux enregistrer mes données avant de terminer, donc ma classe AppControll est conforme au protocole NSApplicationDelegate et a déclaré la méthode; et dans le constructeur d'interface, j'ai lié la sortie déléguée de la fenêtre à AppController, mais je ne peux pas invoquer la méthode.applicationWillTerminate n'est pas invoqué

Où est-ce que je me trompe, que dois-je faire?

+1

@ user408141: Je remarque (maintenant) que @Firoze Lafeer ajouté les balises [cacao] et [osx] après le fait. Est-ce ce que vous vouliez dire, ou vouliez-vous dire «UIApplicationDelegate» (Cocoa Touch)? –

Répondre

4

Vous souvenez-vous d'ajouter le gestionnaire à l'application?

UIApplication *app = [UIApplication sharedApplication]; 
[[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(applicationWillTerminate:) 
    name:UIApplicationWillTerminateNotification object:app]; 
+0

Thx, bro: D Cela fonctionne! –

+0

heureux que cela a aidé :) –

+3

La documentation suggère que ce n'est pas nécessaire: http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/ intfm/UIApplicationDelegate/applicationWillTerminate: Notez qu'il est documenté comme prenant l'objet UIApplication, pas un NSNotification, ce qui suggère que la méthode delegate n'est pas un gestionnaire de notification. Vous ne devriez pas avoir besoin d'observer la notification pour recevoir ce message. Et même dans Cocoa, où c'est une notification, vous n'avez toujours pas besoin de l'observer explicitement. –

2

Le multitâche est-il toujours activé? Cela pourrait être le problème - en appuyant sur le bouton d'accueil ne provoque pas applicationWillTerminate: d'être appelé si l'application passe en arrière-plan.

6

Terminez-vous l'application de Xcode? Alternativement, une interruption soudaine est-elle activée dans votre Info.plist? L'un ou l'autre de ces éléments provoquera l'envoi d'un signal SIGTERM à l'application, l'arrêtant immédiatement, sans que l'instance de NSApplication puisse envoyer à son délégué un message applicationWillTerminate:. (Ceci est le point de rupture brutale:.. Votre application meurt instantanément Vous pouvez le désactiver et programmation pour les moments où ce serait mauvais)

Essayez de quitter votre application en elle-même (l'élément de menu Quitter votre Menu Application), ou en utilisant le Dock pour le quitter (faites un clic droit sur la vignette de votre application et choisissez "Quitter"). Tant que la terminaison soudaine est désactivée (ou n'a jamais été activée), l'un de ceux-ci provoquera l'envoi par votre objet d'application du message applicationWillTerminate:.

Vérifiez également que votre délégué reçoit d'autres messages de délégation d'application, tels que applicationWillFinishLaunching:, et assurez-vous que vous avez branché la prise dans la bonne plume (votre plume MainMenu).

0

En applicationWillFinishLaunching: ajouter:

[[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(applicationWillTerminate:) 
    name:UIApplicationWillTerminateNotification object:nil]; 
+0

copie la réponse existante au-dessus –

+1

@MaxMacLeod Aucune raison pour un downvote. Les votes sont censés indiquer au lecteur la qualité d'une réponse et l'utilisateur qui demande de l'aide ne prend pas en compte s'il y a une autre réponse avec le même contenu ou non. Cette réponse est bonne et cette réponse est juste et juste parce que quelqu'un d'autre était plus rapide ne fait pas une mauvaise réponse. Si la duplication était un problème, il serait possible de marquer les messages en double, mais comme vous pouvez le voir, il n'y a pas d'indicateur en double. – Mecki

+0

@Mecki vous avez quelques bons points. Bien que dans ce cas, la réponse en double a été postée cinq ans plus tard. Je suis heureux d'améliorer mon comportement SO. Pourriez-vous référencer les liens d'aide de SO qui sauvegardent votre commentaire? –