CocoaProgrammingで、キー入力のイベントでテキストを変更させるOSXアプリを作成してみました。
そこで今回は、キーボードで何かしらのキー入力を行ったイベントを取得して、ラベルのテキストを変更するMacアプリの作り方を紹介します。
はじめに
今回紹介する方法はCocoa開発、使用言語はSwiftで行っていきます。
また、Xcodeのストーリーボードから簡単なレイアウトのアプリケーションを作成しているので注意してください。
ではまず先に今回完成したOSXアプリの動作を確認してください。
今回作成するOSXアプリで、キー入力を取得するためには「keyUp( )」というコードを使用します。
詳しくは後述しますが、この記述を行うことでキーボードをタイピングした時のイベントを取得できました。
使用例としては、テキストフィールドでユーザーがテキストを編集し、エンターキーを入力したら確定させるというような時に使えるかと思います。
また、今回はキーイベントですが、マウスイベントも取得することができます。
それについてはこちらから確認してみてください。
では早速ストーリーボードにラベルオブジェクトを配置してみましょう。
ストーリーボードを作る
今回はキー入力を取得するだけなので、設置するオブジェクトは「ラベル」と「テキストフィールド」にしました。
テキストフィールドはキー入力を検知する時に、入力ができない場所でタイピングしてもアラートがなるだけだったので設置しました。
もし、テキストフィールド以外をフォーカスした状態でのキー入力を取得したい場合は「FirstResponder」に記述を追加する必要があります。
それについてはまた別の記事で紹介する予定ですので、今回はテキストフィールドでキー入力した時のイベント発火だけ紹介します。
ストーリーボードのオブジェクトはたったこれだけで、中心に設置されている「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から入力キーに変換しているのですが、もしキーコードをそのまま表示したい場合はこんな感じ。
ですので、仮にエンターキーを入力した時を検知する場合の処理は
というような書き方になるかと思います。( エンターキー(returnキー)のキーコードは36)
まとめ
今回紹介したkeyUp( )を使うことで、テキストフィールドでキー入力を行ったイベントを取得することができました。
例えばエンターキー(returnキー)が入力されたらテキストを確定させる、というような処理を記述する時にぜひ活用してみてください。
ではまた。