nak435
@nak435

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

macOS Monterey GCKeyboard.coalesced が nil に

Q&A

Closed

解決したいこと

macOS 11.6まで機能していた、GCKeyboard.coalescedですが、
Monterey 12.0.1 にアップデートしたところ、常にnilを返すようになりました。

ご存知の方に解決策を教えていただいたいです。

発生している問題・エラー

if let keyboard = GCKeyboard.coalesced?.keyboardInput {
    keyboard.keyChangedHandler = {
        (keyboard, key, keyCode, pressed) in
            //処理(省略)
    }

    keyboard.button(forKeyCode: .spacebar)?.valueChangedHandler = {
        (key, value, pressed) in
            //処理(省略)
}

上記のコードにおいて、macOS 11.6までは、if文の内側のコードが処理されていましたが、
macOS Monterey 12.0.1 にアップデートしたところ、GCKeyboard.coalescedが常にnilを返すようになり、if文のelseに流れます。

実は、iOS15(iPadOS15)も同じ結果となります。
つまり、iOS14(iPadOS14)ではGCKeyboard.coalescedでGCKeyboardのインスタンスが得られていましたが、iOS15(iPadOS15)にアップデートしてから、nilが返るようになりました。

macOS12、iOS15(iPadOS15)のアップデートがきっかけで動作仕様が変わったかのように想定されますが、
Apple Developer Forum等をググっても何も情報を得られず、原因不明でお手上げの状態です。

ご存知の方にご教授いただきたいです。よろしくお願いします。

関連記事:Mac Catalystでのキーボードイベントについて 【Xcode & Swift】

0

1Answer

前提に書き忘れましたが、Mac CatalystでiOS(iPadOS)とmacOSを同一ソースコードで実装しています。

自己解決です。
viewDidLoad()で上記のキーボード入力処理を書いていましたが、ここだとGCKeyboard.coalescedがnilを返しますが、2度目のviewDidLayoutSubviews()だと GCKeyboard.coalescedでGCKeyboardのインスタンスが得られることが分かりました。これ以降はGCKeyboard.coalescedがnilになることはありません。
2度目の、というところはよく分かりませんが、ウィンドウにフォーカスが当たった後のように見えます。
完全解決ではありませんが、回避策が分かったので、この質問をクローズいたします。

1Like

Your answer might help someone💌