UIAccelerometer neodesílá události do druhého delegáta

hlasů
1

Jsem rozvoj hru, která používá jiný řadič pro každou úroveň. Je třeba odhalit chvění pomocí akcelerometru, takže se zaregistruje sám jako delegát jako tak:

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

Když je úroveň skončí, tento řadič dostane dealloc'd a uvolněno. Dříve jsem se dostat pád poté, co tento řadič byl propuštěn, protože jsem neměl nil mimo delegáta na UIAccelerometer (to znamená, že se stále posílání událostí na objekt, který byl nyní osvobozený). Takže teď, uvnitř dealloc, Dělám to:

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

Je vše v pořádku a dobré, a první stupeň hraje bez problémů. Problém se stane, když jsem se dostat do další úrovně, vytvořit nový řadič úrovni a spustit, že první várka kód znovu (nastavení nového contoller nyní jako delegáta). Poté, já jsem nedostal žádné hovory z akcelerometru.

Takže otázka je, jste pouze povoleno mít jednoho delegáta za aplikace pro akcelerometr, nebo jsem jen něco chybí? Neviděl jsem nic docs, že zakážete nastavením delegátovi vícekrát. Jsem trochu nový Obj-C, ale pokud chápu delegátů by to nemělo být příliš neortodoxní.

Poznámka: Vím, že v 3,0 mohl jen poslouchat oznámení protřepat. Bohužel, musím něco jiného být první pomoci po celou dobu Mám zájem o chvění. Takže nemohu jen refactor k této možnosti.

Položena 11/11/2009 v 22:05
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Obecně platí, že objekty, které mají delegáti mají pouze jeden po druhém. Pokud není prokázáno jinak, by neměl být žádná omezení na stanovení více než jeden různý objekt jako delegáta po celou dobu životnosti pro daný případ.

Zajímalo by mě, jestli to, co se děje, je, že vaše první řadič je dealloced po nastavit druhý řadič jako urychlovače delegáta. Už jste sledovali tento kód s debugger, aby se ujistili, že vše, co se děje v pořadí, které očekáváte?

Odpovězeno 11/11/2009 v 22:19
zdroj uživatelem

hlasů
2

Možným řešením by bylo mít jinou třídu, možná delegáta aplikace, působí jako delegát UIAccelerometer a mají tato třída poslat zvyk si NSNotification, kdy obdrží accelerometer:didAccelerate:zprávu. Dalo by se buď pouze odeslat zprávu, když detekuje typ zrychlení, které vás zajímají, nebo jste mohli zaslat oznámení pokaždé, a musí obsahovat UIAcceleration paramter jako součást oznámení userInfo. Vaše řadiče, které mají zájem o datech zrychlení mohou zaregistrovat pro oznamování podle potřeby.

Odpovězeno 11/11/2009 v 22:52
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more