2012-04-17 58 views
4

我想在的WebView从Javascript传递一个函数引用,所以我的Objective-C代码可以调用然后返回到该功能时,异步的OBJ-C方法完成。我看到如何在简单类型传递 - 字符串,数字,等等 - 但似乎无法弄清楚如何通过一些功能的参考,像如何将JavaScript回调函数传递给Cocoa/Obj-C?

window.myRootObject.myObjCSelector("some-string", function(data) { 
    console.log(data); 
}); 

我周围的谷歌搜索,而是继续总结一下,并没有在文档中找到对此的参考(尚)。在Cocoa工作,但希望能够在iOS上做同样的事情。

在此先感谢您的帮助!

编辑:函数的参数应该是匿名的 - 但愿能阐明。 :)

回答

14

终于想通了这一点。可能有更好的方法(如果是这样,请加上!)但以下似乎工作。在我的OBJ-C(NSObject派生)类 - 到我传递一个参照WebView - 我定义了下面的脚本访问的方法:

#import <WebKit/WebKit.h> 
#import <JavaScriptCore/JavaScriptCore.h> 

- (void) search:(NSString *)prefix withCallback:(WebScriptObject *)callback; 

...其目的是采取两个参数:用于搜索的字符串,以及匿名函数回调来处理结果。它的实现如下:

- (void) search:(NSString *)prefix withCallback:(WebScriptObject *)callback 
{ 
    // Functions get passed in as WebScriptObjects, which give you access to the function as a JSObject 
    JSObjectRef ref = [callback JSObject]; 

    // Through WebView, you can get to the JS globalContext 
    JSContextRef ctx = [[view mainFrame] globalContext]; 

    // In my case, I have a JSON string I want to pass back into the page as a JavaScript object 
    JSValueRef obj = JSValueMakeFromJSONString(ctx, JSStringCreateWithCFString((__bridge CFStringRef)responseString)); 

    // And here's where I call the callback and pass in the JS object 
    JSObjectCallAsFunction(ctx, ref, NULL, 1, &obj, NULL); 
} 

这实际上是异步通过Objective-C块,但要点在上面。希望它可以帮助别人!

+0

谢谢;这绝对帮助了我! – tenfour 2014-10-29 12:28:47

0

也许,如果它是你可以尝试传递函数名的OBJ-C,然后评估某事像[NSString stringWithFormat:@"%@()", function_name]一个全球性的匿名函数?

+0

啊,是我不好 - 它应该是匿名的,道歉和我编辑,以做出更清晰。 – 2012-04-17 19:16:56

+0

恐怕这是不可能的。你不能给它一些名字,并使用'window.myRootObject.myObjCSelector(“some-string”,mynamespace_func1);'?你可以很容易地从Obj-C调用它... – 2012-04-18 12:10:23

+0

当然,我可以做到这一点。但是,假设第二个参数是一个JavaScript函数引用,Objective-C如何知道要在WebView上调用哪些JavaScript函数? (我希望我很清楚 - 如果不是,我很抱歉。) – 2012-04-18 16:32:48

相关问题