代码之家  ›  专栏  ›  技术社区  ›  Cesar

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

  •  4
  • Cesar  · 技术社区  · 14 年前

    我发现在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 回复  |  直到 14 年前
        1
  •  3
  •   Aaron Saunders    14 年前

    我认为这是最好的办法,即使不是唯一的办法。

    这个PhoneGap.exec调用只是把对象的NSDictionary放在了封面下,所以我看不出更好的方法来处理它。

    大多数方法的结构如下

    - (void)someMethod:(NSArray*)arguments withDict:(NSDictionary*)options {
    }
    
        2
  •  9
  •   Shazron    14 年前

    PhoneGap.exec是为简单类型设计的。您的方法是可以的,或者您可以只传入您的单个对象(只对单个对象有效,请参阅页脚中有关如何封送命令的内容),它应该在命令的选项字典中。然后在Objective-C端,使用键值编码自动用字典填充自定义对象。

    例如 MyCustomObject*blah=[MyCustomObject new];

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

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

    对于JS命令:

    生成的命令url为:

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