PhoneGap.exec () передает объекты между JS и Obj-C - PullRequest
4 голосов
/ 22 октября 2010

Единственный способ, который я нашел для передачи объектов между JS и Obj-C, это кодирование объекта JS с помощью JSON.stringify () и передача строки 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 ]

9 голосов
/ 28 октября 2010

PhoneGap.exec был разработан для простых типов.Ваш путь в порядке, в качестве альтернативы вы можете просто передать свой единственный объект (будет работать только для одного объекта, см. Нижний колонтитул о том, как мы упорядочиваем команду), и он должен быть в словаре опций для команды.Затем на стороне Objective-C используйте кодирование значения ключа, чтобы автоматически заполнить ваш пользовательский объект словарем.

например, 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-адрес команды: gap: //MyPlugin.myCommand/foo/bar/baz/? mykey1 = myvalue1 & mykey2= myvalue2

Это будет обработано и преобразовано на стороне Objective-C.foo, bar, baz помещаются в массив аргументов, а параметры запроса - в словарь опций.Он будет искать класс с именем «MyPlugin» и будет вызывать селектор «myCommand» с массивом аргументов и словарем опций в качестве параметров.

Для получения дополнительной информации см. Phonegap.js, посмотрите PhoneGap.run_command

3 голосов
/ 25 октября 2010

Я думаю, что это лучший способ сделать это, если не единственный способ.

Вызов PhoneGap.exec просто берет NSDictionary объектов под крышками, поэтому я не вижу лучшего способа

большинство методов структурированы как

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