2

我正在使用 JavaScriptCore 来评估我的应用程序中的一些简单脚本。我正在创建一个全局对象并在其上定义一些属性,如下所示:

JSContext *context = [[JSContext alloc] init];
JSValue *globalObject = [context globalObject];

[globalObject setValue:fields forProperty:@"fields"];
...

这样脚本就可以访问其中的值fields等等。我希望脚本能够使用一个名为 的函数lookup,并且我已经有了这个函数的 Objective-C 实现。

如何向全局对象添加一个属性,该对象是一个回调我的 Objective-C 方法的函数?我看到有一个名为 的函数JSObjectMakeFunctionWithCallback,但它使用像 s 这样的低级 C 结构JSObjectRef并采用 C 函数,而不是 Objective-C 块,所以我无法self在实现内部使用。

4

1 回答 1

1

您可以将 Objective-C 块传递给 JSContext,然后它将表现为函数。这样,您的脚本可以回调您的 iOS 代码:

context[@"factorial"] = ^(int x) {
    int factorial = 1;
    for (; x > 1; x--) {
        factorial *= x;
    }
    return factorial;
};
[context evaluateScript:@"var fiveFactorial = factorial(5);"];
JSValue *fiveFactorial = context[@"fiveFactorial"];
NSLog(@"5! = %@", fiveFactorial);

资料来源:Bignerdranch

于 2013-10-21T13:40:29.543 回答