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

Думаю, я сделал все, что должен, чтобы обнаружить встряску, но 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.)


person Grumdrig    schedule 20.08.2010    source источник


Ответы (4)


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

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

-(BOOL)becomeFirstResponder
{
    return YES;
}
person exeapps    schedule 20.09.2013
comment
Это правильный способ сделать это. У меня это сработало. У меня возникла проблема, потому что мое представление было в контроллере представления навигации - person Markicevic; 09.05.2017
comment
это как-то портит цепочку репсондеров для IBActions. - person Hogdotmac; 17.12.2018

То, как цепочка 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];
person BadPirate    schedule 03.04.2011
comment
более подробный ответ будет на stackoverflow.com/questions/150446/ Джо Д'Андреа - person LolaRun; 08.06.2011
comment
Вы заметили, что проверяли event.type против UIEventSubtypeMotionShake, который является подтипом? По совпадению это сработало, потому что UIEventSubtypeMotionShake и UIEventTypeMotion имеют одинаковое значение. - person bio; 14.12.2015

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

person tc.    schedule 21.08.2010
comment
Я пробовал называть его и в других местах, но, похоже, это не помогло - как в drawView. - person Grumdrig; 22.08.2010
comment
Можете ли вы создать контроллер представления, чтобы вставить в него EAGLView и вызвать статьFirstResponder в viewDidAppear: - person tc.; 23.08.2010
comment
Я вроде как пытался избежать этого, если мог. UIViews есть UIResponders, если я не ошибаюсь. - person Grumdrig; 24.08.2010

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

person Community    schedule 24.08.2010