UIAccelerometer не отправляет события второму делегату - PullRequest
1 голос
/ 12 ноября 2009

Я разрабатываю игру, которая использует разные контроллеры для каждого уровня. Он должен обнаруживать сотрясение через акселерометр, поэтому он регистрируется как делегат следующим образом:

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

Когда уровень заканчивается, этот контроллер освобождается и освобождается. Ранее я получал сбой после того, как этот контроллер был освобожден, потому что я не обнулял делегата на UIAccelerometer (то есть он все еще отправлял события объекту, который теперь освобожден). Итак, теперь внутри dealloc я делаю это:

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

Все хорошо, и первый уровень играет без помех. Проблема возникает, когда я перехожу на следующий уровень, создаю новый контроллер уровня и снова запускаю этот первый пакет кода (устанавливая новый контроллер сейчас как делегат). После этого я не получаю никаких звонков от акселерометра.

Итак, вопрос в том, разрешено ли вам иметь только одного делегата на приложение для акселерометра или я что-то упускаю? В документах я не видел ничего, что не позволяло бы устанавливать делегата несколько раз. Я немного новичок в Obj-C, но, насколько я понимаю, делегаты, это не должно быть слишком необычным.

Примечание: я знаю, что в 3.0 я мог просто слушать уведомления о встряхивании. К сожалению, мне нужно что-то еще, чтобы быть первым ответчиком все время, когда меня интересует встряска. Поэтому я не могу просто изменить этот вариант.

Ответы [ 2 ]

2 голосов
/ 12 ноября 2009

Возможное решение состоит в том, чтобы другой класс, возможно, делегат вашего приложения, действовал как делегат UIAccelerometer и чтобы этот класс отправлял пользователю NSNotification при получении сообщения accelerometer:didAccelerate:. Вы можете либо отправить сообщение только тогда, когда вы обнаружите тип ускорения, о котором вы заботитесь, либо вы можете отправлять уведомление каждый раз и включать параметр UIAcceleration как часть уведомлений userInfo. Ваши контроллеры, которые заинтересованы в данных ускорения, могут при необходимости регистрироваться для уведомлений.

2 голосов
/ 12 ноября 2009

Как правило, объекты, имеющие делегатов, имеют только один объект за раз. Если не указано иное, не должно быть каких-либо ограничений на установку более одного объекта в качестве делегата в течение времени жизни конкретного экземпляра.

Интересно, происходит ли то, что ваш первый контроллер dealloc ed после вы устанавливаете второй контроллер в качестве делегата ускорителя. Вы смотрели этот код с помощью отладчика, чтобы убедиться, что все происходит в том порядке, в котором вы ожидаете?

...