【问题标题】:Pass NSDictionary from Javascript to Objective-c in JavascriptCore将 NSDictionary 从 Javascript 传递到 JavascriptCore 中的 Objective-c
【发布时间】:2017-03-28 09:48:21
【问题描述】:

我在我的应用程序中使用JavascriptCore。现在,我将一些变量传递给JSContext,然后可以传递回Objective-C。但是,其中一个变量 NSDictionary 没有正确通过。我运行下面的代码:

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

这是一个简单的示例,在JSContext 中设置了以下方法。

这是setDictionary() 方法:

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

这是variables.dictionary

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

我就是这样称呼evaluate()

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

但是,在 setDictionary 方法中,我没有得到一个 NSDictionary,而是得到一个包含 [object Object] 的 NSString。

有什么办法可以解决这个问题吗?

【问题讨论】:

  • 请在问题中添加对应的 Objective-C 代码。
  • @BorisVerebsky 我添加了它!

标签: javascript ios objective-c javascriptcore


【解决方案1】:

虽然 JavaScriptCore 会自动在 Objective-C 或 Swift 与 JavaScript 之间转换类型,但我建议实现显式转换。自动转换并不总是像开发人员期望的那样工作。例如undefined 转换为@"undefined" 以防万一,当使用NSString

尝试类似:

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

请注意,JavaScript 使用对象作为字典,因此您应该非常小心传递给 Objective-C 代码的参数。传递任何系统对象将导致该对象递归转换为NSDictionary

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    相关资源
    最近更新 更多