J'ai une sous-classe Nsview personnalisée qui doit gérer certains événements de clavier. Dans l'objectif-c, je pourrais le gérer comme ceci: à Swift, cependant, J'ai eu ce travail, mais cela ressemble à une solution laideuse. Y a-t-il une meilleure façon? P> caractérisatindex: code> renvoie un
unichar code>, tandis que NsuparrowfonctionKey: int code> et
"": chaîne code> (ou
caractère code>). Il n'est pas clair pour moi comment convertir un Unichar en une chaîne
ou
ou
ou
. P>
func keyDown(theEvent: NSEvent) {
let char = Int(theEvent.charactersIgnoringModifiers.utf16[0]) // <----- This seems ugly
let hasCommand = (theEvent.modifierFlags & .CommandKeyMask).value != 0
switch char {
case NSUpArrowFunctionKey where hasCommand == true:
// Scroll to top
break
case NSDownArrowFunctionKey where hasCommand == true:
// Scroll to bottom
break
case NSRightArrowFunctionKey where hasCommand == true:
// Select the current row
break
case Int(" ".utf16[0]): // <---- Surely there's a better way of doing this?
// Scroll down one page
break
default:
super.keyDown(theEvent)
}
}
3 Réponses :
Pourquoi ne pas utiliser extensions strong>? case Character(" ").keyCode: // Spacebar
println("spacebar!")
NSEvent.KeyCode Code> est une chose différente avec la fonction de fonction Constances Unicode. C'est un code mappé sur la clé matérielle plutôt qu'un caractère unicode sémantique. Par exemple, il rapporte
126 code> pour
nsuparrowfonctionkey code> (défini comme
0xf700 code> sous clé de fonction unique (i> section i> section) dans mon clavier . N'utilisez pas
KeyCode code> pour comparer la fonction de fonction Unicode.
Il n'utilise pas nsvent.keycode code>. Le nom de la méthode est un peu malheureux, mais l'extension est censée être utilisée avec l'instruction de commutation qu'il a suggéré, ce qui correspond correctement.
OSX gère des éléments-clés-événements utilisant au moins deux couches différentes.
codcode code>. Je crois que c'est un code mappé sur chaque clé de clavier matériel. LI>
- Unicode. Point de code Unicode prédéfini mappé sur une clé virtuelle sémantique. LI>
ul>
Vous devez utiliser la touche Unicode pour traiter correctement les événements utilisateur.
Vous pouvez prendre le point de code Unicode de l'objet événement comme celui-ci. P>
override func keyDown(theEvent: NSEvent) {
let s = theEvent.charactersIgnoringModifiers!
let s1 = s.unicodeScalars
let s2 = s1[s1.startIndex].value
let s3 = Int(s2)
switch s3 {
case NSUpArrowFunctionKey:
wc1.navigateUp()
return
case NSDownArrowFunctionKey:
wc1.navigateDown()
return
default:
break
}
super.keyDown(theEvent)
}
Laissez l'OFT-négligé le Référence de la classe NSREPonder Répondre aux messages d'action Répertorie ces méthodes et d'autres méthodes de traitement des événements de clavier. p> p> interprétage () code> faire les bits désordonnés pour vous. Il connaît toutes sortes de clés, y compris les touches fléchées:
Notez que
TheEvent.CharacterSignorSmodificateurs == String (NsuparrowFunctionKeyKey) Code> ne revient jamais vrai, autant que je puisse dire.
La plus belle chose que je puisse trouver est d'utiliser un caractère réel que le sélecteur de cas: qui vous permet de comparer avec
caractère ("") code> pour la clé d'espace, par exemple. Vous devez toujours faire quelque chose de assez moche pour convertir les codes de clé entier pour correspondre, cependant. Le mieux que je puisse trouver était d'utiliser
caractère (Unicodecalar (NsuparrowfonctionKeyKey)) code> pour transformer les constantes en caractères de Swiftian réels. Peut-être que ce que cela a vraiment besoin, c'est de plus de versions swiftian des constantes, plutôt que de tout autre ...