2015-10-10 4 views
5

Je pense qu'il me manque quelque chose de très basique, mais je n'arrive pas à appuyer sur un bouton pour passer outre.tvos Overriding pressesBegan

J'essaie de détecter la pression sur le bouton de menu, donc je remplace pressesBegan: et tester le UIPressTypeMenu. La méthode attrape le bouton de menu, appuie sur, et exécute mon code, mais suit immédiatement avec une sortie d'application de toute façon.

Voici ma méthode substituée. Est-ce que quelqu'un sait ce que je fais mal? Y a-t-il autre chose dont j'ai besoin pour annuler la sortie automatique du menu? C'est presque comme s'il y avait deux répondeurs. Même chose avec le robinet gauche et le robinet droit. Ils sont reconnus, mon code se déclenche, mais l'objectif change de toute façon car je n'ai pas complètement géré l'événement.

J'ai essayé le code dans le premier contrôleur d'affichage de l'application et le menu est remplacé correctement. Ensuite, j'ai mis en place une vue vide et présente cette vue en tant que vue numéro 2 et je ne peux pas obtenir les méthodes à remplacer.

- (void)pressesBegan:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event { 

    for(UIPress *press in presses) { 
     if(press.type == UIPressTypeMenu) { 

      [(UIImageView *) [self.view viewWithTag:100] setUserInteractionEnabled:NO]; 

     } 
     if(press.type == UIPressTypePlayPause) { 
      // play and pause code 
     } 
    } 
} 


-(void) pressesEnded:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event { 

    // 
    for(UIPress *press in presses) { 
     if(press.type == UIPressTypeMenu) { 
      // do ButtonA job 
      NSLog(@"test"); 
     } 
     if(press.type == UIPressTypePlayPause) { 
      // do ButtonX job 
     } else { 


     } 
    } 

} 

-(void) pressesChanged:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event { 

    // Works fine! 
    for(UIPress *press in presses) { 
     if(press.type == UIPressTypeMenu) { 
      // do ButtonA job 
     } 
     if(press.type == UIPressTypePlayPause) { 
      // do ButtonX job 
     } 
    } 

} 

-(void) pressesCancelled:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event { 

    // Works fine! 
    for(UIPress *press in presses) { 
     if(press.type == UIPressTypeMenu) { 
      // do ButtonA job 
      NSLog(@"cancelled"); 
     } 
     if(press.type == UIPressTypePlayPause) { 
      // do ButtonX job 
     } 
    } 
} 
+0

avez-vous résoudre ce problème? J'essaie aussi de capturer le bouton de menu. –

Répondre

2

L'application est sortie parce que vous autorisez le message pressesEnded:withEvent: pour revenir au sommet de la chaîne de répondeur. Vous devez également remplacer cette méthode, et faites pas appelez super si vous ne voulez pas que l'application quitte (faites attention ici, cependant: si l'utilisateur ne peut pas utiliser Menu pour quitter, ils seront extrêmement frustrés avec vous) Les flèches gauche et droite déclenchent des changements de focus parce que ceux-ci sont gérés avec des méthodes de reconnaissance de mouvements, et non avec les méthodes pressesBegan/, cela n'a donc aucune importance si votre vue les remplace.

Le Event Handling Guide for iOS a plus de détails sur la façon dont les reconnaisseurs de gestes et les méthodes UIResponder interagissent les uns avec les autres.

+0

Merci pour l'aide potentielle! En fait, j'avais aussi pressé PressesEnded, pressesChanged et pressesCancelled. Désolé je devrais avoir mis ceux dans ma question aussi. Je n'appelle pas super dans aucune des méthodes. – jpsquare

+0

Et vous êtes sûr que ces méthodes sont appelées? Essayez de définir un point d'arrêt dans le débogueur ou d'ajouter un enregistrement pour être sûr. Pourriez-vous modifier votre question pour inclure le code de ces méthodes? –

+0

En fait, pressesEnded ne semble pas être appelé. Bien que, lors de ma première vue, pressesEnded ne soit pas appelée, le bouton de menu est toujours surchargé. – jpsquare

0

ne pas oublier cela sur vous gameScene:

override func didMoveToView(view: SKView) { 
    super.didMoveToView(view) 
}