javascript - 将 NSDictionary 从 Javascript 传递到 JavascriptCore 中的 Objective-c

标签 javascript ios objective-c javascriptcore

我在我的应用程序中使用 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。

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

最佳答案

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

尝试这样的事情:

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

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

关于javascript - 将 NSDictionary 从 Javascript 传递到 JavascriptCore 中的 Objective-c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43066204/

相关文章:

ios - UILongPressGestureRecognizer 按下坐标

objective-c - 使用运行循环覆盖 main.m 但仍然进入 NSApplicationMain 调用?

objective-c - 在远程通知中添加文本字段,iOS 8

javascript - react-addon-test-utils createElement 问题

javascript - AngularJS + Google map 不显示标记

iOS - 检查定时器是否有效

ios - 64 位 OpenTok 框架

javascript - 我在使用复选框时遇到问题

javascript - 为什么我的 getElementById( ) 在 Applescript 中的结果是 "missing value"?

objective-c - if 语句在其条件变量设置之前执行