2009-03-08 6 views
2

Das ist eine Möglichkeit, die Ereignisse in Shoes zu entfernen? Ich habe viele Websites und Referenzen durchsucht, aber ich kann keine Möglichkeit finden, ein Ereignis zu entfernen ... Ich habe darauf geachtet, dass ich meinen eigenen Event Manager erstellen muss ... ist das wirklich nötig? Oder gibt es eine Möglichkeit, Ereignis-Listener zu entfernen?Entfernen von Ereignissen in Shoes

Antwort

0

Haben Sie versucht method.unbind(obj)?

+0

Das wird ihm eine Kopie der Methode geben, die nicht an das Objekt gebunden ist, aber es wird die Methode nicht aus dem Objekt entfernen, und ich kann keine Interpretation der Frage sehen, für die das würde helfen. – MarkusQ

0

Können Sie klarstellen, was Sie unter "Entfernen eines Ereignisses" verstehen? Möchten Sie ein bestimmtes Ereignis ignorieren oder möchten Sie einen Ereignis-Listener "ausschalten"?

Wenn der ehemalige, würde ich vorschlagen, einen Listener zu schreiben, die das Ereignis einfach ignorieren.

Wenn das später, warum nicht den Körper des Zuhörers von einigen extern zugänglichen Wert abhängig machen, geben Sie sich einen Ein/Aus-Schalter.

Wenn Sie etwas anderes wollen, bearbeiten Sie die Frage zu klären, und ich werde später wieder aufhören und meine Antwort bearbeiten.

Als Antwort auf Ihren Kommentar, würde ich die zweite der oben genannten Alternativen vorschlagen. Wenn Sie wirklich Lust bekommen wollen kann man so etwas schreiben:

$keypress_listeners = {} 
keypress do |key| 
    $keypress_listeners.values.each { |l| l.call(key) 
    end 
$keypress_listeners[:hero_controller] = lambda { |key| ... } 
: 
: 
$keypress_listeners.delete[:hero_controller] 

und ebenfalls für alle anderen Ereignisse, aber das ist wahrscheinlich übertrieben. Auf der anderen Seite gibt es Ihnen die totale Kontrolle über die Ereignisverarbeitung.

+0

Der Fall ist, ich erstelle ein Spiel, und wenn das Spiel in einem Level eintritt, muss ich Ereignisse zur Steuerung des Helden hinzufügen, und wenn das Spiel das Spiel verlassen (um zu einem anderen Bildschirmtyp zu gehen) muss ich entfernen Ereignisse, die den Helden steuern, hinzufügen, dann links, wenn Sie in eine neue Phase eintreten –

1

Welche Tastaturbelegungen möchten Sie entfernen? Alle Ereignisse in der App "Shoes" oder nur die Standardbindungen?

Wenn Sie Bindungen für Schuhe wie "alt- /" reserviert außer Kraft zu setzen, "alt-.", "Alt-?", Fügen Sie den folgenden Code in die Datei, die den Anwendungscode enthält

class Shoes::App 
    def Shoes.show_log # gets called on alt-/ 
    end 

    def Shoes.show_manual # gets called on alt-? 
    end 

    def Shoes.show_selector # gets called on alt-. 
    end 
end 

Der obige Code affe-patches den Schuh-Code und wiederum macht nichts, wenn die entsprechenden Tasten gedrückt werden.

Sie können die gleiche Technik für den Rest der Standardbindungen verwenden. grep die Schuhe Quelle für die Tastenbelegungen, finden Sie die entsprechende Methode und definieren Sie eine leere Methode in Ihrer App, um die integrierte Methode zu überschreiben.

2

Ich habe festgestellt, dass Shoes nur eine einzige Listener-Methode für ein bestimmtes Ereignis erlaubt, sodass Sie einen vorherigen Listener entfernen können, indem Sie das Ereignis aufrufen und keinen Block an ihn übergeben.

Zum Beispiel löscht diese Shoes-App das Klickereignis, nachdem es einmal geklickt wurde. Wenn Sie den Anruf zu innerhalb innerhalb des Blocks entfernen, wird es wiederholt ausgelöst.