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

您可以将 CF 类型强制转换为 NS 类型,方法是首先重新绑定 CFMakeCollectable 函数,使其接受 'void *' 并返回 'id',然后使用该函数执行强制:

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 回答