2015-10-10 12 views
5

Ich denke, ich vermisse etwas ziemlich einfach, aber ich kann nicht drücken, um richtig zu überschreiben.tvos Overriding pressesBegan

Ich versuche zu erkennen, die Menü-Taste drücken, also überschreibe ich pressesBegan: und Test für die UIPressTypeMenu. Die Methode fängt die Menütaste auf und führt meinen Code aus, folgt dann aber sofort mit einem App-Exit trotzdem.

Hier ist meine überschriebene Methode. Weiß jemand, was ich falsch mache? Gibt es noch etwas anderes, um den automatischen Menüausgang zu umgehen? Es ist fast so, als gäbe es zwei Responder. Gleiches gilt für den linken und rechten Tipp. Sie werden erkannt, mein Code feuert, aber dann ändert sich der Fokus sowieso, weil ich das Ereignis nicht vollständig behandelt habe.

Ich habe versucht, den Code in der ersten Ansicht Controller der App und das Menü ordnungsgemäß überschrieben. Dann richte ich eine leere Ansicht ein und präsentiere diese Ansicht als Ansicht Nummer 2, und ich kann die Methoden zum Überschreiben nicht erhalten.

- (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

haben Sie dieses Problem lösen? Ich versuche auch, die Menü-Taste zu erfassen. –

Antwort

2

Die App verlässt, wird, weil Sie die pressesEnded:withEvent: Nachricht sind damit bis an die Spitze der Antwortkette zurück zu bekommen. Sie sollten auch diese Methode überschreiben, und tun Sie nicht Anruf super, wenn Sie nicht möchten, dass die App beendet wird (seien Sie hier vorsichtig, wenn der Benutzer Menü nicht zum Beenden verwenden kann, werden sie sehr frustriert sein)

Die linken und rechten Pfeile lösen Fokusänderungen aus, da diese mit Gestenerkennungen behandelt werden, nicht mit pressesBegan/pressesEnded Methoden, es ist also egal, ob Ihre Ansicht diese überschreibt.

Die Event Handling Guide for iOS hat mehr Details darüber, wie Gestenerkenner und die UIResponder Methoden miteinander interagieren.

+0

Danke für die mögliche Hilfe! Eigentlich hatte ich auch die Maschinen außer Kraft gesetztEnded, pressesChanged und pressesCancelled. Tut mir leid, ich hätte das auch in meine Frage stellen sollen. Ich rufe in keiner der Methoden super an. – jpsquare

+0

Und Sie sind sicher, dass diese Methoden aufgerufen werden? Versuchen Sie, einen Haltepunkt im Debugger festzulegen oder eine Protokollierung hinzuzufügen, um sicherzugehen. Können Sie Ihre Frage so modifizieren, dass sie den Code für diese Methoden enthält? –

+0

Eigentlich scheint pressEnded nicht angerufen zu werden. Obwohl in meiner ersten Ansicht pressesEnded nicht aufgerufen wird, wird die Menüschaltfläche jedoch noch überschrieben. – jpsquare

0

tun dies nicht auf Sie gameScene vergessen:

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