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派生)クラスで-への参照を渡しWebViewます-私は次のスクリプトアクセス可能なメソッドを定義します:

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

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

...これは、検索に使用する文字列と、結果を処理するための無名関数コールバックの2つの引数を取ることを目的としています。このように実装されています:

- (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を評価してみてください[NSString stringWithFormat:@"%@()", function_name]

于 2012-04-17T19:14:38.083 に答える