クリアメモリ

プログラミングやガジェットレビュー、便利なアプリケーションなど雑多に記録するブログ

【Swift】キー入力イベントを取得するkeyUpの使い方

f:id:clrmemory:20170422184139p:plain 

Cocoa Programmingで、キー入力のイベントでテキストを変更させるOSXアプリを作成してみました。

そこで今回は、キーボードで何かしらのキー入力を行ったイベントを取得して、ラベルのテキストを変更するMacアプリの作り方を紹介します。

 

 

はじめに

 

今回紹介する方法はCocoa開発、使用言語はSwiftで行っていきます。

また、Xcodeのストーリーボードから簡単なレイアウトのアプリケーションを作成しているので注意してください。

 

ではまず先に今回完成したOSXアプリの動作を確認してください。

 

 

今回作成するOSXアプリで、キー入力を取得するためには「keyUp( )」というコードを使用します。詳しくは後述しますが、この記述を行うことでキーボードをタイピングした時のイベントを取得できました。

使用例としては、テキストフィールドでユーザーがテキストを編集し、エンターキーを入力したら確定させるというような時に使えるかと思います。

 

また、今回はキーイベントですが、マウスイベントも取得することができます。それについてはこちらから確認してみてください。

 

https://clrmemory.com/swift/cocoa-mouse-clickevent/

 

 

では早速ストーリーボードにラベルオブジェクトを配置してみましょう。

 

ストーリーボードを作る

 

今回はキー入力を取得するだけなので、設置するオブジェクトは「ラベル」と「テキストフィールド」にしました。テキストフィールドはキー入力を検知する時に、入力ができない場所でタイピングしてもアラートがなるだけだったので設置しました。

 

 

もし、テキストフィールド以外をフォーカスした状態でのキー入力を取得したい場合は「FirstResponder」に記述を追加する必要があります。それについてはまた別の記事で紹介する予定ですので、今回はテキストフィールドでキー入力した時のイベント発火だけ紹介します。

 

追記:

テキストフィールド外でのキー入力イベントを取得する方法を記事にしました。

 

https://clrmemory.com/swift/cocoa-keyevent-out-of-textfield/

 

 

ストーリーボードのオブジェクトはたったこれだけで、中心に設置されている「Label」のテキストを「入力したキー」に書き換えるというような流れです。

 

keyUpを記述する

 

冒頭でも紹介した通り、キーボードの入力を検知するために必要な記述は「keyUp」です。

そのことを踏まえた上で、以下のコードを確認してください。

 

import Cocoa

class ViewController: NSViewController {

    @IBOutlet weak var textField: NSTextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }
    override func keyUp(with event: NSEvent) {
        print("KeyUp")
        textField.stringValue = String(describing: event.characters!)
    }
}

 

こちらが「キー入力」のイベントでテキストの値を変更するコードになっています。

この中にある「keyUp(with event: NSEvent)」に着目してください。このような記述をすることで、テキストフィールドなどでキー入力が発生した場合にイベントを発火でき、textField.stringValueの値を変更させました。

 

keyUpは厳密にいうと「キー入力を離した時」のイベントです。つまり、キーボードを押し込んでから離した時に呼ばれるもので、もしキーを押し込んだ時にイベントを発火させたい時は、keyUpではなく「keyDown」を使うと良いと思います。

 

ちなみに今回のこのような記述の場合、矢印キーやShiftキーなどは出力できません。

 

event.characters!でkeyCodeから入力キーに変換しているのですが、もしキーコードをそのまま表示したい場合は

【 textField.stringValue = String(describing: event.keyCode) 】

ですね。

 

ですので、仮にエンターキーを入力した時を検知する場合の処理は

【 if event.keyCode == 36 { … } 】

というような書き方になるかと思います。( エンターキー(returnキー)のキーコードは36)

 

まとめ

 

今回紹介したkeyUp( )を使うことで、テキストフィールドでキー入力を行ったイベントを取得することができました。

例えばエンターキー(returnキー)が入力されたらテキストを確定させる、というような処理を記述する時にぜひ活用してみてください。

 

ではまた。

新着記事