12
votes

Manipulation des événements de clavier dans AppKit avec Swift

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: xxx pré>

à Swift, cependant, 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>

J'ai eu ce travail, mais cela ressemble à une solution laideuse. Y a-t-il une meilleure façon? 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)
    }
}


2 commentaires

Notez que TheEvent.CharacterSignorSmodificateurs == String (NsuparrowFunctionKeyKey) 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 ("") 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)) 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 ...


3 Réponses :


8
votes

Pourquoi ne pas utiliser extensions strong>?

case Character(" ").keyCode: // Spacebar
    println("spacebar!")


2 commentaires

NSEvent.KeyCode 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 pour nsuparrowfonctionkey (défini comme 0xf700 sous clé de fonction unique (i> section section) dans mon clavier . N'utilisez pas KeyCode pour comparer la fonction de fonction Unicode.


Il n'utilise pas nsvent.keycode . 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.



4
votes

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)
    }
    


0 commentaires

15
votes

Laissez l'OFT-négligé interprétage () faire les bits désordonnés pour vous. Il connaît toutes sortes de clés, y compris les touches fléchées: xxx

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.


0 commentaires