Слушатели уведомлений, вызывающие сбои - PullRequest
4 голосов
/ 17 января 2012

Я использую следующий код для обнаружения / прослушивания, когда iPad меняет ориентацию устройства.

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];   
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(didRotate:)
                                                 name:@"UIDeviceOrientationDidChangeNotification" 
                                               object:nil];

Это вызывает мой метод didRotate: когда что-то меняется. В моем методе didRotate: я использую UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];, чтобы выяснить, какова ориентация, и соответственно применить мой код.

Однако в реальных тестах я заметил, что didRotate: вызывается каждую секунду, если iPad находится в руке человека. Похоже, что слушатель буквально прислушивается к каждому небольшому наклону и сдвигу в iPad, что, очевидно, часто происходит в руках человека (в отличие от плоского на столе).

Есть идеи, как я могу это исправить? Я мог бы изменить свой код, чтобы использовать ориентацию интерфейса, но у меня были проблемы с ним по любой причине. Спасибо.

* ОБНОВЛЕНИЕ : Этот слушатель создан в моем подклассе UIImageView. На экране их около десятка или больше. Я добавил [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; в мои методы удаления, когда я удаляю экземпляр. Это помогает объяснить, почему Rootate так часто появлялся (моя ошибка).

Тем не менее, я сузил сбои: всякий раз, когда я удаляю это экземпляр этого подкласса и поворачиваю свой iPad, я сбою. Иногда я получаю странные сообщения, такие как [__NSArrayM didRotate]: нераспознанный селектор (и другие странные объекты, такие как UIPanVelocity ... что-то). Мой слушатель все еще слушает после удаления экземпляра?

ИСПРАВЛЕНО : Спасибо за вашу помощь. Я наконец заметил, что было не так. Я удалял экземпляр, не удаляя наблюдателя и не заканчивая уведомления. Добавление следующего кода в методы удаления моего экземпляра решает мою проблему:

[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] removeObserver:self];

Ответы [ 2 ]

2 голосов
/ 17 января 2012

Я предполагаю, что вы постоянно добавляете наблюдателей и никогда не удаляете их.Это означает, что одна и та же точка входа может вызываться несколько раз для одного события.Это также означает, что, когда «сам» объект исчезает, вы получаете сбой.

1 голос
/ 17 января 2012

Уведомление отправляется только в том случае, если устройство переключается с одной ориентации на другую - оно не срабатывает чаще, чем необходимо.

UIDeviceOrientation имеет на 2 направления больше, чем UIInterfaceOrientation. Он имеет FaceUp и FaceDown. Возможно, это срабатывает, и они вам не интересны.

typedef enum {
UIDeviceOrientationUnknown,
UIDeviceOrientationPortrait,
UIDeviceOrientationPortraitUpsideDown,
UIDeviceOrientationLandscapeLeft,
UIDeviceOrientationLandscapeRight,
UIDeviceOrientationFaceUp,
UIDeviceOrientationFaceDown
} UIDeviceOrientation;

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

typedef enum {
UIInterfaceOrientationPortrait           = UIDeviceOrientationPortrait,
UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
UIInterfaceOrientationLandscapeLeft      = UIDeviceOrientationLandscapeRight,
UIInterfaceOrientationLandscapeRight     = UIDeviceOrientationLandscapeLeft
} UIInterfaceOrientation;

.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...