2012-01-16 2 views
4

Я использую следующий код для обнаружения/прослушивания, когда 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]; методам удаления, когда я удаляю экземпляр. Это помогает объяснить, почему didRotate продолжал проявляться так много (моя ошибка).

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

FIXED: Благодарим за помощь. Наконец я заметил, что случилось. Я удалял экземпляр без удаления наблюдателя и завершения уведомлений. Добавление следующего кода в мои методы удаления экземпляра исправляет мою проблему:

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

В качестве примечания стороны используйте константу 'имя: UIDeviceOrientationDidChangeNotification' не его строковое значение' name: @ "UIDeviceOrientationDidChangeNotification" ' – bandejapaisa

ответ

2

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

1

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

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 
+0

Привет, у меня есть NSLog в моем методе didRotate и его показ, что его постоянно вызываются. Единственный метод, вызывающий didRotate, - это прослушиватель ориентации устройства, о котором я упоминал ранее, поэтому я на 100% уверен, что слушатель продолжает называть мой didRotate. Если я буду класть iPad на свой стол, это не называется. Когда он находится в моих руках и движется, но даже не вращается, вызывается didRotate.Спасибо – user339946

+0

Где вы добавили код, который вы опубликовали? Возможно, этот бит кода называется несколько раз - кумуляция множества наблюдателей, следовательно didRotate: вызывается несколько раз - один раз для каждого добавленного наблюдателя, хотя и тот же наблюдатель. – bandejapaisa

+0

Привет, это правильно. Этот слушатель входит в каждый UIImageView, который я показываю на экране (до десятка или более). Я сужу к этому сбой. Я добавил [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; к моим методам удаления. Похоже, всякий раз, когда изображение снижается, и я перемещаю iPad, он падает. – user339946