2015-06-09 17 views
6

Ich versuche, eine Anwendung für OS X mit Swift und Cocoa zu erstellen. Ich möchte, dass die Anwendung auf wichtige Ereignisse reagiert, ohne dass der Fokus auf/in einem Textfeld liegt. Ich habe ein neues Cocoa-Projekt mit Storyboards in Xcode und habe die ViewController.swift Klasse auf den folgende Änderung:Swift NSViewController reagiert auf mouseDown-Ereignis, aber nicht keyDown-Ereignis

import Cocoa 

class ViewController: NSViewController { 

    override func mouseDown(theEvent: NSEvent) { 
     println("Mouse Clicked") 
    } 

    override func keyDown(theEvent: NSEvent) { 
     println("Key Pressed") 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override var representedObject: AnyObject? { 
     didSet { 
     } 
    } 

} 

Wenn ich das Programm laufen, ich Konsolenausgabe, wenn ich auf dem Fenster klicken, aber ich don Ich bekomme keine Konsolenausgabe, wenn ich irgendeine Taste drücke.

Also meine Fragen sind: Warum auf Mausereignisse aber nicht wichtige Ereignisse nicht mein Programm reagiert? Welche zusätzlichen Schritte muss ich ausführen, damit wichtige Ereignisse wie die Mausereignisse funktionieren?

Es scheint, dass mein View-Controller in der Responder-Kette ist, da er die Mausereignisse abfängt, so dass das nicht das Problem zu sein scheint. Ich habe andere Antworten hier auf SE gefunden, die sagen, dass ich die Klasse NSView oder NSWindow ableiten muss. Ist es möglich, wichtige Ereignisse zu bekommen, ohne das zu tun?

Vielen Dank im Voraus.

EDIT: Neben der Antwort akzeptiert, ist Swift - Capture keydown from NSViewController eine große, klare Lösung.

+0

Könnten Sie bitte Ihren Code für die Unterklassenbildung von NSView angeben? Ich muss dasselbe tun, was ich glaube. Ich versuche, Pfeiltasten zu drücken, wenn Sie gedrückt werden. – justColbs

+1

Die beste Antwort auf diese Frage ist hier: http://stackoverflow.com/questions/32446978/swift-capture-keydown-from-nsviewcontroller/32447474 Ich poste dies, weil keines der gegebenen Beispiele mir wirklich geholfen hat und ich bekam eine wirklich einfache Antwort in der Post über das funktionierte, sogar in Xcode 8 und Swift 3. – jvarela

+0

@jvarela Das ist ein guter Link. Vielen Dank. Ich werde meine Frage aktualisieren, um darauf zu verlinken. – Bernem

Antwort

7

Der Unterschied, den Sie beobachtet haben, rührt von der Tatsache her, dass Cocoa Mausereignisse und Tastaturereignisse etwas anders behandelt. In einem frühen Stadium des Ereignisauslieferungsprozesses werden alle Ereignisse systemweise an das Objekt NSWindow gesendet. Bei Mausereignissen werden sie von NSWindow an die Ansicht weitergeleitet, auf die der Benutzer geklickt hat. Für Tastaturereignisse wird NSWindow sie an die First Responder des aktuellen Schlüsselfensters weiterleiten.

Die anfängliche Ersthelfer eines NSWindow ist das Fenster selbst. Wenn der Benutzer klickt auf eine NSView wird NSWindowversuchen zu machen, dass die Ersthelfer anzeigen lassen, indem eine acceptsFirstResponder Nachricht sendet. Wenn sie YES zurückgibt, wird die angeklickte Ansicht zum Ersthelfer.

Das "Gotcha" ist jedoch, dass acceptsFirstResponder standardmäßig NO zurückgibt. Da eine einfache NSView nicht zum ersten Responder wird, wird sie keine Tastaturereignisse erhalten. Die einfachste Lösung besteht also darin, Ihre NSView Unterklasse acceptsFirstResponder zu YES zurückzugeben.

Verwandte Themen