2017-03-28 4 views
1

私のアプリでJavascriptCoreを使用しています。今、Objective-Cに戻すことができるJSContextにいくつかの変数を渡します。しかし、変数の1つ、NSDictionaryが正しく通過していません。私は以下のコードを実行します。JavascriptからNSDictionaryをJavascriptCoreのObjective-cに渡します

var evaluate = function(variables) { 
    app.setDictionary(variables.dictionary); 
} 

これはJSContextに設定し、これらの以下のメソッドを持っている簡単な例です。

- (void)setDicationary:(NSDictionary *)dictionary { 
    self.mutableDictionary = [dictionary mutableCopy]; 
} 

これはvariables.dictionary次のとおりです:

これはsetDictionary()方法である

- (NSDictionary *)dictionary { 
    return self.values; 
} 

そして、これは私がevaluate()呼び出す方法です:setDictionary方法で、しかし

JSValue *jsFunction = self.context[@"evaluate"]; 
JSValue *value = [jsFunction callWithArguments:@[self.variables]]; 

を、私はNSDictionaryを取得しませんが、代わりにNSStringを取得します[object Object]

どのように私はこれを解決することができますか?

+0

質問にObjective-Cコードを追加してください。 –

+0

@BorisVerebsky私はそれを追加しました! – user4992124

答えて

1

JavaScriptCoreはObjective-CまたはSwiftとJavaScriptの間の型を自動的に変換しますが、明示的な変換を実装することをお勧めします。開発者が期待するとおり、自動変換が常に機能するとは限りません。例えばundefinedは、NSStringが使用される場合、@"undefined"に変換されます。あなたはObjective-Cのコードに渡す引数と非常に注意しなければならないので、JavaScriptは、辞書などのオブジェクトを使用していること

- (void)setDicationary:(JSValue *)jsDictionary { 
    if ([jsDictionary isUndefined] || [jsDictionary isNull]) { 
     jsDictionary = nil; 
    } 
    self.mutableDictionary = [jsDictionary toDictionary]; 
} 

注:

のようなものを試してみてください。システムオブジェクトを渡すと、そのオブジェクトの再帰的な変換が行われ、NSDictionaryになります。

関連する問題