2010-08-20 5 views
2

Je pense que j'ai fait tout ce que je devrais pour détecter un tremblement, mais motionEnded:withEvent: ne se fait jamais appeler. (Une ride est que je n'ai pas UIViewController - mon application est basé sur le modèle « OpenGL ES App ».)motionEnded n'est pas appelé (contrôleur sans affichage)

J'ai ajouté à mon application.applicationSupportsShakeToEdit = YES;application:didFinishLaunchingWithOptions: et

- (BOOL)canBecomeFirstResponder { return YES; } 

à EAGLView .m (qui est appelé), et [self becomeFirstResponder]; à initWithCoder: (et ont essayé plusieurs autres endroits aussi).

Mais le débogueur frappe jamais

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

Suis-je manque une étape? Dois-je avoir un contrôleur?

(j'utilise iOS 3.2 dans le simulateur iPad.)

Répondre

0

La mise à jour vers la dernière version du SDK a résolu le problème de façon magique. [Shrug]

0

Vous ne pouvez pas devenir le premier intervenant avant votre point de vue dans la hiérarchie de la vue.

+0

J'ai essayé appeler d'autres endroits aussi, mais il ne semble pas aider - comme dans 'drawView'. – Grumdrig

+0

Pouvez-vous créer un contrôleur de vue pour coller EAGLView, et appelez comeFirstResponder dans viewDidAppear :? –

+0

J'essayais d'éviter cela si je le pouvais. 'UIView's sont' UIResponder's, si je ne me trompe pas. – Grumdrig

1

La façon dont la chaîne UIResponder fonctionne avec la notification de secousse est odieuse. Il semble que UIWindow reçoive toujours la notification, puis les sous-répondeurs peuvent ou non en fonction de ce qui est au-dessus d'eux dans la chaîne. J'ai créé une sous-classe UIWindow, et défini comme ma classe de fenêtre avec ce qui suit:

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

Ensuite, pour toutes les vues qui voulaient les notifications de trembler, je les avais simplement s'ajouter à titre d'observateur à l'événement UIEventSubtypeMotionShakeEnded, et ils l'ont eu à chaque fois.

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

une réponse plus approfondie serait sur http://stackoverflow.com/questions/150446/how-do-i-detect-when-someone-shakes-an-iphone par Joe D'Andrea – LolaRun

+0

Avez-vous remarqué que vous avez vérifié 'event .type' contre 'UIEventSubtypeMotionShake' qui est un sous-type? Par coïncidence, cela a fonctionné parce que «UIEventSubtypeMotionShake» et «UIEventTypeMotion» ont la même valeur. – bio

2

Vous devez ajouter à votre contrôleur:

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

-(BOOL)becomeFirstResponder 
{ 
    return YES; 
} 
+0

C'est la bonne façon de le faire. Cela a fonctionné pour moi. J'ai eu un problème parce que ma vue était dans le contrôleur de vue de navigation – Markicevic