PhoneGap.exec()在JS和Obj-C之间传递对象

时间:2010-10-22 02:10:16

标签: iphone json object parameter-passing cordova

我发现在JS和Obj-C之间传递对象的唯一方法是使用JSON.stringify()编码JS对象并将json字符串传递给PhoneGap.exec

PhoneGap.exec('Alarm.update',JSON.stringify(list));

...并在Obj-C中重建对象:

NSString *jsonStr = [arguments objectAtIndex:0];
jsonStr = [jsonStr stringByReplacingOccurrencesOfString:@"\\\"" withString:@"\""];
jsonStr = [NSString stringWithFormat:@"[%@]",jsonStr];
NSObject *arg = [jsonStr JSONValue];

这是正确的吗?这样做有更好/更合适/官方的方式吗?

2 个答案:

答案 0 :(得分:9)

PhoneGap.exec专为简单类型而设计。你的方式还可以,你可以只传递你的单个对象(仅适用于单个对象,请参阅我们如何编组命令的页脚),它应该在命令的选项字典中。然后在Objective-C方面,使用键值编码自动使用字典填充自定义对象。

e.g。 MyCustomObject * blah = [MyCustomObject new]; [blah setValuesForKeysWithDictionary:options];

如果您对PhoneGap.exec的工作方式感兴趣,请继续阅读...

* --------- *

对于PhoneGap.exec,javascript参数被封送到一个URL中。

对于JS命令: PhoneGap.exec('MyPlugin.command','foo','bar','baz',{mykey1:'myvalue1',mykey2:'myvalue2'});

生成的命令url是: 间隙://MyPlugin.myCommand/foo/bar/baz/ mykey1 = myvalue1&安培; mykey2 = myvalue2

这将在Objective-C方面进行处理和转换。 foo,bar,baz放在arguments数组中,查询参数放在options字典中。它将查找一个名为“MyPlugin”的类,并使用参数array和options dictionary作为参数调用选择器“myCommand”。

有关详细信息,请参阅phonegap.js,查看PhoneGap.run_command

答案 1 :(得分:3)

我认为这是最好的方法,如果不是唯一的方法。

PhoneGap.exec调用只需要一个NSDictionary的对象,所以我没有看到更好的方法来处理它。

大多数方法的结构类似于

- (void)someMethod:(NSArray*)arguments withDict:(NSDictionary*)options {
}