Pregunta

Estoy desarrollando un juego que usa un controlador diferente para cada nivel.Necesita detectar una sacudida a través del acelerómetro, por lo que se registra como delegado de la siguiente manera:

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

Cuando termina el nivel, este controlador se desasigna y se libera.Anteriormente, sufría un bloqueo después de que se liberara este controlador porque no anulé el delegado en UIAccelerometer (es decir,todavía estaba enviando eventos a un objeto que ahora ha sido liberado).Ahora, dentro de dealloc, estoy haciendo esto:

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

Todo está muy bien y el primer nivel se desarrolla sin problemas.El problema ocurre cuando llego al siguiente nivel, creo un nuevo controlador de nivel y ejecuto ese primer lote de código nuevamente (configurando el nuevo controlador ahora como delegado).Después de esto, no recibo ninguna llamada del acelerómetro.

Entonces la pregunta es: ¿solo se permite tener un delegado por aplicación para el acelerómetro o simplemente me falta algo?No he visto nada en los documentos que no permita configurar el delegado varias veces.Soy un poco nuevo en Obj-C, pero hasta donde tengo entendido, los delegados, esto no debería ser demasiado poco ortodoxo.

Nota:Sé que en 3.0 podía escuchar las notificaciones de sacudidas.Desafortunadamente, necesito algo más para ser el primero en responder todo el tiempo que esté interesado en el batido.Así que no puedo simplemente refactorizar esa opción.

¿Fue útil?

Solución

En general, los objetos que tienen los delegados tienen sólo uno a la vez. A menos documentada de otra manera, no debería haber ninguna limitación en el establecimiento de más de un objeto diferente como delegado durante la vida útil de una instancia particular.

Me pregunto si lo que sucede es que el primer controlador está siendo dealloced después se establece el segundo controlador como el delegado del acelerador. ¿Has observado que el código con el depurador para estar seguro de que eso ocurra de todo en el orden se puede esperar?

Otros consejos

Una posible solución sería tener una clase diferente, tal vez el delegado de su aplicación, que actúe como delegado del UIAccelerometer y que esa clase envíe una NSNotification personalizada cuando reciba el accelerometer:didAccelerate: mensaje.Puede enviar el mensaje solo cuando detecte el tipo de aceleración que le interesa o puede enviar la notificación cada vez e incluir el parámetro UIAcceleration como parte de las notificaciones. userInfo.Los controladores que estén interesados ​​en los datos de aceleración pueden registrarse para recibir las notificaciones según sea necesario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top