4

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

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

我已经用谷歌搜索了,但仍然很短,并且在文档中还没有找到对此的参考(还)。在 Cocoa 中工作,但希望能够在 iOS 上做同样的事情。

提前感谢您的帮助!

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

4

2 回答 2

15

终于想通了。可能有更好的方法(如果是这样,请加入!)但以下方法似乎有效。在我的 Obj-C ( NSObject-derived) 类中——我将一个引用传递到其中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 块异步工作,但要点在上面。希望它可以帮助别人!

于 2012-04-19T00:31:44.767 回答
0

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

于 2012-04-17T19:14:38.083 回答