2

ObjC ブリッジを介して OSX 入力言語の読み取り/設定を試す場合は、次のようなスニペットを記述します。

(function () {
    'use strict';

    ObjC.import('Carbon');
    ObjC.import('stdio');

    var sourceList = $.TISCreateInputSourceList(null, false);

    var current_source = $.TISCopyCurrentKeyboardInputSource();

    var cfs = $.TISGetInputSourceProperty(current_source, $.kTISPropertyInputSourceID);
    var cfn = $.TISGetInputSourceProperty(current_source, $.kTISPropertyLocalizedName)

    var sourceCount = $.CFArrayGetCount(sourceList)

    return $.CFArrayGetValueAtIndex(sourceList, 0)

})();

すぐに、CF 型の obj 参照の戻り値を取得します。ObjC 自体では、これらを NS 値に強制できます。JavaScript for Applications でそれをどのように達成できるかについて何か感覚はありますか?

(文字列またはその他のプリミティブ値の抽出に成功していない CF オブジェクト参照の戻り値を取得しています)

4

1 に答える 1

3

最初にCFMakeCollectable関数を再バインドして「void *」を取り、「id」を返し、その関数を使用して強制を実行することにより、CF型をNS型に強制できます。

ObjC.bindFunction('CFMakeCollectable', [ 'id', [ 'void *' ] ]);

var cfString = $.CFStringCreateWithCString(0, "foo", 0); // => [object Ref]
var nsString = $.CFMakeCollectable(cfString);            // => $("foo")

これをコードで使いやすくするため.toNS()に、Ref プロトタイプで関数を定義することができます。

Ref.prototype.toNS = function () { return $.CFMakeCollectable(this); }

TIS* 関数でこの新しい関数を使用する方法は次のとおりです。

ObjC.import('Carbon');

var current_source = $.TISCopyCurrentKeyboardInputSource();
var cfs = $.TISGetInputSourceProperty(current_source, $.kTISPropertyInputSourceID);

cfs.toNS() // => $("com.apple.keylayout.US")
于 2016-01-26T04:29:23.210 に答える