Bezdepbonusu7Программирование: статьи и ответы

Вопрос

MotionEnded не вызывается (нет контроллера представления)

Автор вопроса: GrumdrigОтветов: 4

Думаю, я сделал все, что должен, чтобы обнаружить встряску, но motionEnded:withEvent: никогда не звонит. (Одна проблема в том, что у меня нет UIViewController - мое приложение основано на шаблоне "OpenGL ES App".)

Я добавил application.applicationSupportsShakeToEdit = YES; в свой application:didFinishLaunchingWithOptions:, и

- (BOOL)canBecomeFirstResponder { return YES; }

на EAGLView.m (который вызывается) и от [self becomeFirstResponder]; до initWithCoder: (и пробовали также разные другие места).

Но отладчик никогда не попадает

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event

Я пропустил какой-то шаг? Мне нужен контроллер?

(Я использую iOS 3.2 в симуляторе iPad.)

iosiphoneipadshakemotion

Ответы

Ответ 1 · рейтинг 4 · exeapps

Вы должны добавить это в свой контроллер:

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self becomeFirstResponder];
}

-(BOOL)becomeFirstResponder
{
    return YES;
}

Ответ 2 · рейтинг 3 · BadPirate

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

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if (event.type == UIEventSubtypeMotionShake)
        [[NSNotificationCenter defaultCenter] postNotificationName:@"UIEventSubtypeMotionShakeEnded" object:nil];
}

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

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(shakeNotification:)
                                             name:@"UIEventSubtypeMotionShakeEnded" object:nil];

Ответ 3 · tc.

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

Ответ 4 · Community

Обновление до последней версии SDK волшебным образом устранило проблему. [Пожатие плечами]

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы