OCとJSのインタラクション---JavaScriptCore
4099 ワード
JavaScriptCoreの簡単な紹介
JavaScriptCoreはiOS 7が提供するオリジナルのフレームワークで、Objective-CとJavaScriptに簡単な直接的なインタラクションを提供することができます.
JavaScriptCoreの使用
JavaScriptCoreをインポートframework
使用するクラスにヘッダファイルを導入する
ファイルの先頭に
これらはフレームの時に使うものです.
OCによるJSメソッドの実行またはJSプロパティの呼び出し
JSSContextオブジェクト:
JSの実行環境で、jsコードを実行する方法-evaluateScriptがあります.また、js内のすべての変数メソッドはJSCoextに保存され、JSCoextオブジェクトを操作することで、jsを呼び出すメソッドとjsにアクセスするオブジェクトを実現できます.
JSValueオブジェクト:
それはJSCoextの中のすべての方法と属性に対応して、それはOCとJSが互いにアクセスして修正する中間体で、すべてのOCとjavaScriptの言語をまたがる操作はすべてJSValueのいくつかの方法を通じて行います.
JSValueオブジェクトのcallWithArguments:メソッドでjsのfunctionを直接呼び出します.js functionのマルチパラメータは,OCでNSArrayによって組み立てられている.
JSでOCメソッドを実行するか、OCプロパティを呼び出す
Blockを使用してメソッドを呼び出すことができます
上記のコードでは、sumWithA:WithB:WithCは私たちが定義したOCの方法であり、JSがOCメソッドを呼び出すときに、まずJSCoextオブジェクトを宣言し、sumNumsにBlockを付与し、BlockではOC定義のメソッドsumWithA:WithB:WithCを呼び出す.evaluateScriptを使用してJSコードを実行し、OCメソッドを呼び出し、結果を出力しようとします.
1.いずれの場合も、Blockで外部のJSValueオブジェクトを直接使用するのではなく、JSValueをパラメータとしてBlockに転送する必要があります.2.いずれの場合も、Blockで外部のJSCoextオブジェクトを直接使用するのではなく、[JSCoext currentContext]を使用して取得する必要があります.
JavaScriptCoreはiOS 7が提供するオリジナルのフレームワークで、Objective-CとJavaScriptに簡単な直接的なインタラクションを提供することができます.
JavaScriptCoreの使用
JavaScriptCoreをインポートframework
使用するクラスにヘッダファイルを導入する
#import <JavaScriptCore/JavaScriptCore.h>
ファイルの先頭に
#import "JSContext.h"
#import "JSValue.h"
#import "JSManagedValue.h"
#import "JSVirtualMachine.h"
#import "JSExport.h"
これらはフレームの時に使うものです.
OCによるJSメソッドの実行またはJSプロパティの呼び出し
// OC js js 。
JSContext *context = [[JSContext alloc]init];
[context evaluateScript:@"var arr = [1, 2, 'This is js string'];var sum = function(a, b) { return a+b;}"];
// js arr
JSValue *jsArr = context[@"arr"];
NSArray *ocArr = jsArr.toArray;
NSLog(@"%@",ocArr);
// js ,
JSValue *jsSum = context[@"sum"];
JSValue *jsSumResult = [jsSum callWithArguments:@[@2,@3]];
NSInteger sumResult = jsSumResult.toInt32;
NSLog(@"%d",(int)sumResult);
JSSContextオブジェクト:
JSの実行環境で、jsコードを実行する方法-evaluateScriptがあります.また、js内のすべての変数メソッドはJSCoextに保存され、JSCoextオブジェクトを操作することで、jsを呼び出すメソッドとjsにアクセスするオブジェクトを実現できます.
JSValueオブジェクト:
それはJSCoextの中のすべての方法と属性に対応して、それはOCとJSが互いにアクセスして修正する中間体で、すべてのOCとjavaScriptの言語をまたがる操作はすべてJSValueのいくつかの方法を通じて行います.
NSNumber *jsarr0 = jsArr[0].toNumber;
jsArr[1] = @3;
JSValueオブジェクトのcallWithArguments:メソッドでjsのfunctionを直接呼び出します.js functionのマルチパラメータは,OCでNSArrayによって組み立てられている.
// js ,
JSValue *jsSum = context[@"sum"];
JSValue *jsSumResult = [jsSum callWithArguments:@[@2,@3]];
// JSValue *jsSumResult = [jsSum callWithArguments:[NSArray arrayWithObjects:@2, @3, nil]];
//jsSumResult = 5;
JSでOCメソッドを実行するか、OCプロパティを呼び出す
Blockを使用してメソッドを呼び出すことができます
-(NSInteger) sumWithA:(NSInteger)a WithB:(NSInteger)b WithC:(NSInteger)c{
return a+b+c;
}
-(void)test{
JSContext *context = [[JSContext alloc]init];
context[@"sumNums"] = ^(NSInteger a,NSInteger b,NSInteger c){
return [self sumWithA:a WithB:b WithC:c];
};
JSValue *sum = [context evaluateScript:@"sumNums(7, 56, 22)"];
NSLog(@"%@",sum);
}
上記のコードでは、sumWithA:WithB:WithCは私たちが定義したOCの方法であり、JSがOCメソッドを呼び出すときに、まずJSCoextオブジェクトを宣言し、sumNumsにBlockを付与し、BlockではOC定義のメソッドsumWithA:WithB:WithCを呼び出す.evaluateScriptを使用してJSコードを実行し、OCメソッドを呼び出し、結果を出力しようとします.
1.いずれの場合も、Blockで外部のJSValueオブジェクトを直接使用するのではなく、JSValueをパラメータとしてBlockに転送する必要があります.2.いずれの場合も、Blockで外部のJSCoextオブジェクトを直接使用するのではなく、[JSCoext currentContext]を使用して取得する必要があります.