Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top