Frage

Ich entwickle ein Spiel, das einen anderen Controller für jede Ebene verwendet. Es braucht eine Erschütterung über das Beschleunigungsmesser zu erkennen, so dass er selbst als Delegierter registriert etwa so:

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

Wenn die Pegel Enden dieser Regler wird dealloc'd und befreit. Zuvor war ich einen Absturz bekommen, nachdem dieser Controller befreit wurde, weil ich nicht die Delegierten auf UIAccelerometer nil geklappt hat (das heißt, es war immer noch Ereignisse zu einem Objekt zu senden, die jetzt freigegeben wurde). So, jetzt, innerhalb von dealloc, ich tue dies:

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

Alles ist gut und gut und die erste Ebene spielt ohne Probleme. Das Problem tritt auf, wenn ich auf die nächsten Ebene zu bekommen, eine neue Ebene Controller erstellen und diese erste Partie des Code erneut aus (die neuen contoller nun als Delegierter Einstellung). Danach, bin immer ich keine Anrufe aus dem Accelerometer.

Die Frage ist also, Sie sind nur einen Delegierten pro App für das Accelerometer haben dürfen, oder bin ich nur etwas fehlt? Ich habe nichts in der Dokumentation zu sehen, dass Verbietet den Delegaten mehrere Male einstellen. Ich bin etwas Neues zu Obj-C, aber soweit ich Delegierten verstehen dies sollte nicht zu unorthodox sein.

Hinweis: Ich weiß, dass in 3.0 konnte ich nur für Shake-Benachrichtigungen hören. Leider muss ich etwas anderes Ersthelfer die ganze Zeit, die ich in den Shake interessiert bin. So kann ich nicht nur refactor zu dieser Option.

War es hilfreich?

Lösung

In der Regel Objekte, die Delegierten nur einen nach dem anderen. Soweit nicht anders dokumentiert, soll es keine Einschränkungen sein auf mehr als ein anderes Objekt als Delegierten über die gesamte Lebensdauer einer bestimmten Instanz zu setzen.

Ich frage mich, ob das, was passiert, ist, dass Ihr erster Controller wird dealloced ist nach Sie setzen den zweiten Controller als Beschleuniger delegiert. Haben Sie beobachtet, dass Code mit dem Debugger sicher sein, dass alles in der Reihenfolge geschehen Sie erwarten?

Andere Tipps

Eine mögliche Lösung wäre, eine andere Klasse haben, vielleicht AppDelegate, fungieren als Delegierter des UIAccelerometer und haben diese Klasse senden benutzerdefinierte eine NSNotification, wenn es die accelerometer:didAccelerate: Nachricht empfängt. Sie könnten entweder nur die Nachricht senden, wenn Sie die Art der Beschleunigung erfassen, die Sie interessieren, oder Sie können die Benachrichtigung jedes Mal, und auch die UIAcceleration Paramter im Rahmen der Mitteilungen userInfo senden. Ihre Controller, die in Beschleunigungsdaten interessiert sind, können für die Meldungen registrieren je nach Bedarf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top