如何将JavaScript回调函数传递给Cocoa / Obj-C?

时间:2012-04-17 19:12:06

标签: objective-c cocoa

我正在尝试从WebView中传递JavaScript中的函数引用,因此当异步Obj-C方法完成时,我的Objective-C代码可以调用回该函数。我看到如何传递简单类型 - 字符串,数字等 - 但似乎无法弄清楚如何传递函数引用,如

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

我已经用Google搜索过了,但是仍然没有找到答案,并且尚未在文档中找到对此的引用(尚未)。在Cocoa工作,但很想能够在iOS上做同样的事情。

提前感谢您的帮助!

编辑:函数参数应该是匿名的 - 希望这可以澄清。 :)

2 个答案:

答案 0 :(得分: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块,但要点就在上面。希望它可以帮助别人!

答案 1 :(得分:0)

也许如果它是一个全局非匿名函数,你可以尝试将函数名称传递给Obj-C,然后像[NSString stringWithFormat:@"%@()", function_name]那样评估......