2012-04-17 10 views
4

WebViewでJavaScriptから関数参照を渡そうとしているので、Objective-Cコードは、非同期Obj-Cメソッドが完了したときにObjective-Cコードを呼び出してその関数に戻すことができます。文字列、数値、など - - しかし、何か関数参照渡しする方法を見つけ出すように見えることはできません、私の周りGoogleで検索しましたJavaScriptのコールバック関数をCocoa/Obj-Cに渡すにはどうしたらいいですか?

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

のように、しかし続ける私は単純型で渡す方法をご覧ください要約すると、これはドキュメントではまだ(まだ)見つかりませんでした。ココアで働いていますが、iOSで同じことをすることができることが大好きです。

ありがとうございました!

編集:関数の引数は匿名である必要があります。これにより明らかになります。 :)

答えて

14

最後にこれを認識しました。より良い方法があるかもしれません(もしそうなら、チャイムしてください!)が、以下のように動作するようです。二つの引数を取るように意図されて

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

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

...: - 私はWebViewへの参照を渡すそこに - 私のObj-C(NSObject由来)クラスでは、私は次のスクリプトがアクセス可能なメソッドを定義します:検索する文字列、および結果を処理する無名関数コールバック。

- (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

0

グローバルで非匿名の関数の場合は、関数名をObj-Cに渡してからsthを[NSString stringWithFormat:@"%@()", function_name]のように評価することができますか?

+0

ああ、私の悪い - それは匿名でなければならない、謝罪し、私はそれを明確にするために編集しました。 –

+0

私はこれが可能ではないと恐れています。あなたはいくつかの名前をつけて 'window.myRootObject.myObjCSelector(" some-string "、mynamespace_func1);'? Obj-Cから簡単に呼び出すことができます。 –

+0

確かに、私はそれを行うことができます。しかしObjective-Cは、2番目の引数がJavaScript関数参照であると仮定して、WebViewで呼び出すJavaScript関数をどのように知るのでしょうか? (私は私が明確でないことを願っています - 私がそうでないなら謝罪します) –

関連する問題