ドキュメント

物理キーボードで行われたキープレスの処理

物理キーボードでのユーザーのキープレスおよびキーリリースを検出します。

最新の英語ドキュメント

Handling Key Presses Made on a Physical Keyboard

概要

Mac CatalystでビルドしたiOSアプリとMacアプリでは、システムはアクティブなアプリのレスポンダチェーンでプレスイベントをレスポンダオブジェクトに送信し、ユーザーが物理キーボードで行ったキープレスを報告します。

レスポンダチェーンはUIResponderオブジェクト(UIViewControllerUIApplicationなど)が連なったものです。UIResponderオブジェクトは、イベントを処理するか、イベント処理をアプリ内の別のレスポンダに委任します。レスポンダおよびレスポンダチェーンについての詳細は、「レスポンダおよびレスポンダチェーンを使用したイベントの処理」を参照してください。

キープレスの検出

ユーザーが物理キーボードで行ったキープレスを検出するには、アプリデリゲートやメインビューコントローラなど、アプリのレスポンダオブジェクトでpressesBegan(_:with:)を上書きします。

ユーザーがどのキーを押したか判断するには、各プレスのkeyプロパティを調べて、プレスのセットを順に反復処理します。charactersIgnoringModifiersを使用して、キーのテキスト値を判断し、レスポンダがキープレスを処理すべきかどうか判断します。レスポンダがキープレスを処理しない場合は、スーパークラスでpressesBegan(_:with:)を呼び出して、アクティブなレスポンダチェーンの次のレスポンダにプレスイベントを送信します。

たとえば、次のコードリストでは、ユーザーが左右の矢印キーを押すと、ゲームのキャラクターが前後に走ります。


override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
    // Run backward or forward when the user presses a left or right arrow key.
    
    var didHandleEvent = false
    for press in presses {
        guard let key = press.key else { continue }
        if key.charactersIgnoringModifiers == UIKeyCommand.inputLeftArrow {
            runBackward()
            didHandleEvent = true
        }
        if key.charactersIgnoringModifiers == UIKeyCommand.inputRightArrow {
            runForward()
            didHandleEvent = true
        }
    }
    
    if didHandleEvent == false {
        // Didn't handle this key press, so pass the event to the next responder.
        super.pressesBegan(presses, with: event)
    }
}

キーリリースの検出

ユーザーがキーをリリースした時に検出するには、レスポンダのpressesEnded(_:with:)メソッドを上書きします。キーに関する情報を入手するには、キープレスを検出する場合と同じように、pressesセットの各プレスのkeyプロパティを調べます。たとえば、次のコードリストでは、ユーザーが左または右矢印キーを放すと、キャラクターが特定の向きに走るのをやめます。


override func pressesEnded(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
    // Stop running when the user releases the left or right arrow key.


    var didHandleEvent = false
    for press in presses {
        guard let key = press.key else { continue }
        if key.charactersIgnoringModifiers == UIKeyCommand.inputLeftArrow {
            stopRunningBackward()
            didHandleEvent = true
        }
        if key.charactersIgnoringModifiers == UIKeyCommand.inputRightArrow {
            stopRunningForward()
            didHandleEvent = true
        }
    }
    
    if didHandleEvent == false {
        // Didn't handle this key press, so pass the event to the next responder.
        super.pressesBegan(presses, with: event)
    }
}

関連項目

ユーザー操作