2013-10-21 82 views
2

我正在使用JavaScriptCore來評估我的應用中的一些簡單腳本。我創建一個全局對象,並對其定義,像這樣的一些屬性:如何在Obj-C中用回調定義一個Javascript函數?

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

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

所以那麼該腳本可以訪問值fields等。我希望腳本能夠使用一個名爲lookup的函數,並且我已經有了這個函數的Objective-C實現。

如何向全局對象添加一個屬性,該對象是一個回調我的Objective-C方法的函數?我看到有一個叫做JSObjectMakeFunctionWithCallback的函數,但是它使用低級C結構(如JSObjectRef),並且採用C函數,而不是Objective-C塊,所以我不能在實現中使用self

回答

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

相關問題