Question

Je développe un jeu qui utilise un contrôleur différent pour chaque niveau. Il doit détecter une secousse par l'accéléromètre, il s'enregistre en tant que délégué comme ceci:

UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
accel.delegate = self;
accel.updateInterval = kUpdateInterval; 

Lorsque le niveau se termine, ce contrôleur se dealloc'd et libéré. Auparavant, je recevais un accident après ce contrôleur a été libéré parce que je ne l'ai pas nul le délégué sur UIAccelerometer (à savoir qu'il envoyait toujours des événements à un objet qui a été libéré aujourd'hui). Alors maintenant, à l'intérieur de dealloc, je fais ceci:

UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
accel.delegate = nil;

Tout est bien beau et le premier niveau joue sans accroc. Le problème se produit lorsque je reçois au niveau suivant, créer un nouveau contrôleur de niveau et d'exécuter ce premier lot de code à nouveau (la nouvelle mise contoller maintenant en tant que délégué). Après cela, je ne reçois pas d'appels de la Accéléromètre.

La question est, vous autorisé à avoir un délégué par application pour l'Accéléromètre, ou suis-je manque juste quelque chose? Je ne l'ai pas vu quoi que ce soit dans la documentation qui interdit plusieurs fois le réglage délégué. Je suis un peu nouveau pour Obj-C, mais pour autant que je comprends les délégués cela ne devrait pas être trop peu orthodoxe.

Note: Je sais que dans la version 3.0 que je pouvais écouter les notifications de secousse. Malheureusement, je besoin de quelque chose d'autre pour être le premier intervenant tout le temps que je suis intéressé par la secousse. Je ne peux donc pas seulement factoriser à cette option.

Était-ce utile?

La solution

En général, les objets qui ont les délégués ont seulement un à la fois. À moins d'indication documentée, il ne devrait pas y avoir de limites sur la définition plus d'un autre objet en tant que délégué sur la durée de vie d'une instance particulière.

Je me demande si ce qui se passe est que votre premier contrôleur est dealloced après vous définissez le second contrôleur en tant que délégué de l'accélérateur. Avez-vous regardé ce code avec le débogueur pour être sûr que se passe-tout dans l'ordre que vous attendez?

Autres conseils

Une solution possible serait d'avoir une classe différente, peut-être votre délégué de l'application, agir en tant que délégué du UIAccelerometer et ont cette classe envoie quand il reçoit le message accelerometer:didAccelerate: CUSTOM NSNotification. Vous pouvez soit envoyer uniquement le message lorsque vous détectez le type d'accélération que vous aimez ou vous pouvez envoyer la notification à chaque fois et inclure la paramter de UIAcceleration dans le cadre de la userInfo des notifications. Vos contrôleurs qui sont intéressés par les données d'accélération peuvent enregistrer les notifications au besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top