12

WebView を使用して HTML インターフェイスを表示する Cocoa アプリがあります。HTML インターフェイス内の Javascript 関数から Objective-C メソッドを呼び出すにはどうすればよいですか?

4

4 に答える 4

9

これはdeveloper.apple.comで文書化されています。

于 2008-09-18T13:23:57.530 に答える
4

Apple のドキュメンテーションはかなり環境に配慮しているため、私にはまったく使い物にならないので、Javascript から Objective C メソッドを呼び出し、Cocoa でその逆を行うという概念の証明を行いましたが、後者の方がはるかに簡単でした。

まず、webview が setFrameLoadDelegate であることを確認します。

[testWinWebView setFrameLoadDelegate:self];

特定のオブジェクトが読み込まれるとすぐに監視するように webview に指示する必要があります。

- (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowScriptObject forFrame:(WebFrame *)frame {
    //add the controller to the script environment
    //the "ObjCConnector" object will now be available to JavaScript
    [windowScriptObject setValue:self forKey:@"ObjCConnector"];
}

次に、コミュニケーションのビジネス:

// a few methods to log activity
- (void)acceptJavaScriptFunctionOne:(NSString*) logText {
    NSLog(@"acceptJavaScriptFunctionOne: %@",logText);
}
- (void)acceptJavaScriptFunctionTwo:(NSString*) logText {
    NSLog(@"acceptJavaScriptFunctionTwo: %@",logText);
}

//this returns a nice name for the method in the JavaScript environment
+(NSString*)webScriptNameForSelector:(SEL)sel {
    NSLog(@"%@ received %@ with sel='%@'", self, NSStringFromSelector(_cmd), NSStringFromSelector(sel));
    if(sel == @selector(acceptJavaScriptFunctionOne:))
        return @"functionOne"; // this is what you're sending in from JS to map to above line
    if(sel == @selector(acceptJavaScriptFunctionTwo:))
        return @"functionTwo"; // this is what you're sending in from JS to map to above line
    return nil;
}

//this allows JavaScript to call the -logJavaScriptString: method
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel {
    NSLog(@"isSelectorExcludedFromWebScript: %@", NSStringFromSelector(sel));
    if(sel == @selector(acceptJavaScriptFunctionOne:) ||
       sel == @selector(acceptJavaScriptFunctionTwo:))
        return NO;
    return YES;
}

重要なのは、呼び出したいメソッドが複数ある場合は、それらをすべて isSelectorExcludedFromWebScript メソッドで除外する必要があり、webScriptNameForSelector で ObjC メソッドにマッピングするための JavaScript 呼び出しが必要であるということです。

完全なプロジェクトの概念実証ファイル: https://github.com/bytestudios/JS-function-and-ObjC-method-connector

于 2015-05-26T19:35:01.393 に答える
3

iPhone アプリでそれを行いたい場合は、UIWebViewDelegate メソッド shouldStartLoadWithRequest を使用してトリックを実行する必要があります。

この API http://code.google.com/p/jsbridge-to-cocoa/がそれを行います。とても軽量です。

于 2010-09-13T19:43:06.023 に答える
0

NimbleKit を使用したソリューションがあります。Javascript から Objective C 関数を呼び出すことができます。

于 2010-07-18T09:41:24.487 に答える