Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用JavascriptCore将javascript函数发送到objective-C_Ios_Objective C_Javascriptcore - Fatal编程技术网

Ios 使用JavascriptCore将javascript函数发送到objective-C

Ios 使用JavascriptCore将javascript函数发送到objective-C,ios,objective-c,javascriptcore,Ios,Objective C,Javascriptcore,我正试图利用JSExport协议,通过JavascriptCore向Objective-C发送一个Javascript函数对象。我在Objective-C中声明了一个函数,符合JSExport的要求,如下所示: (class View) + (void) newWithFunc:(id)func { NSLog(@" %@ ", func); } 声明此类后,我尝试使用Javascript函数对象作为参数调用上述函数 JSValue *val; val = [context ev

我正试图利用JSExport协议,通过JavascriptCore向Objective-C发送一个Javascript函数对象。我在Objective-C中声明了一个函数,符合JSExport的要求,如下所示:

(class View)
+ (void) newWithFunc:(id)func
{
    NSLog(@" %@ ", func);   
}
声明此类后,我尝试使用Javascript函数对象作为参数调用上述函数

JSValue *val;
val = [context evaluateScript:@"var mufunc = function() { self.value = 10; };"];
val = [context evaluateScript:@"mufunc;"];
NSLog(@" %@", val); //Prints as 'function() { self.value = 10; }', seems correct.
val = [context evaluateScript:@"var view = View.newWithFunc(mufunc);"];

最后一次调用时,发送到Objective-C方法的参数类型为“NSDictionary”,如果我想在以后的某个时间点从Objective-C调用该函数,则该类型似乎没有多大价值。这在JavascriptCore中是可能的吗?

这绝对是可能的,但您需要更改newWithFunc:以接受JSValue*而不是普通id。原因是JSValue*是JavaScriptCore的特殊类型-它不会尝试将JS值转换为其本机等效值,而是将其包装在JSValue中并传递。

请标记为正确。我不知道他是怎么知道的,也不知道记录在哪里,但这是我通过反复试验得出的结论:

- (void)newWithFunc: (JSValue*)func
{
    [func callWithArguments:@[]]; // will invoke js func with no params
}
声明参数
(id)func
显然会导致javascript cocoa桥将其转换为NSDictionary(如您所注意到的),从而使其无法作为可调用的JSValue使用