Pergunta

Estou desenvolvendo um jogo que utiliza um controlador diferente para cada nível.Ele precisa detectar um tremor através do acelerômetro, então ele se registra como um delegado da seguinte forma:

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

Quando o nível termina, este controlador é desalocado e liberado.Anteriormente, eu estava travando depois que esse controlador foi liberado porque não anulei o delegado no UIAccelerometer (ou seja,ainda estava enviando eventos para um objeto que agora foi liberado).Então agora, dentro do dealloc, estou fazendo isso:

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

Tudo está bem e o primeiro nível é jogado sem problemas.O problema acontece quando chego ao próximo nível, crio um novo controlador de nível e executo o primeiro lote de código novamente (definindo o novo contoller agora como delegado).Depois disso, não recebo nenhuma ligação do acelerômetro.

Portanto, a questão é: você só pode ter um delegado por aplicativo para o acelerômetro ou está faltando alguma coisa?Não vi nada nos documentos que proíba a configuração do delegado várias vezes.Sou um pouco novo no Obj-C, mas até onde entendi os delegados, isso não deve ser muito pouco ortodoxo.

Observação:Eu sei que no 3.0 eu poderia apenas ouvir notificações de tremores.Infelizmente, preciso de outra coisa para ser o socorrista durante todo o tempo em que estiver interessado no shake.Portanto, não posso simplesmente refatorar essa opção.

Foi útil?

Solução

Em geral, objetos que têm delegados têm apenas um de cada vez. Salvo documentado em contrário, não deve haver limitações na definição de mais de um objeto diferente como delegado ao longo da vida de uma instância específica.

Eu me pergunto se o que está acontecendo é que seu primeiro controlador está sendo dealloced depois Você define o segundo controlador como o delegado do acelerador. Você já assistiu a esse código com o depurador para ter certeza de que tudo está acontecendo na ordem que você espera?

Outras dicas

Uma solução possível seria ter uma classe diferente, talvez o delegado do seu aplicativo, atuando como delegado do UIAccelerometer e fazer com que essa classe enviasse um NSNotification personalizado quando receber o accelerometer:didAccelerate: mensagem.Você pode enviar a mensagem apenas quando detectar o tipo de aceleração de seu interesse ou pode enviar a notificação sempre e incluir o parâmetro UIAcceleration como parte das notificações userInfo.Seus controladores interessados ​​em dados de aceleração podem se registrar para receber notificações conforme necessário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top