Передача NSArray, содержащего объекты NSDictionary в функцию Javascript - PullRequest
1 голос
/ 19 апреля 2011

У меня есть требование, в котором у меня есть огромный набор информации в NSArray, который содержит объекты NSDictionary.Теперь я должен передать их в функцию javascript через веб-просмотр, используя:

- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script

Мои вопросы:

  1. Как мне подготовить аргументы на стороне вызывающего, чтобы Javascriptпонимает это?
  2. Как получить их в Javascript?По сути, какой должна быть сигнатура функции и как я могу прочитать пары ключ-значение объектов словаря массива внутри функции Java?

У меня в основном не хватает опыта, когда дело доходит до Javascript,так что простите, если этот вопрос слишком абстрактный, я надеюсь, что мой вопрос ясен, хотя!

Редактировать: Я пришел через поток , который утверждает, что передача объектов NSDictionaryк функциям JavaScript не представляется возможным.Итак, как мы можем достичь этого?

Спасибо и С уважением, Радж

Ответы [ 3 ]

2 голосов
/ 18 сентября 2011

Вы также можете скопировать их и соединить их вместе, похоже, что это делают парни ....

function stringToNSString(str) {
  return ['@"',str,'"'].join('');
}
function numberToNSNumber(num) {
  return ['[NSNumber numberWithLong:',num,']'].join('');
}
function booleanToNSNumber(bool) {
  return ['[NSNumber numberWithBool:',(bool ? 'YES' : 'NO'),']'].join('');
}

function nullToNSNull(){
  return '[NSNull null]';
}

function arrayToNSArray(array){
  var lines = _(array).map(function(value){
    var convertedValue;
    if (_(value).isString()) {
      convertedValue = stringToNSString(value);
    } else if (_(value).isNumber()) {
      convertedValue = numberToNSNumber(value);
    } else if (_(value).isBoolean()) {
      convertedValue = booleanToNSNumber(value);
    } else if (_(value).isNull()) {
      convertedValue = nullToNSNull();
    } else if  (_(value).isArray()) {
      convertedValue = arrayToNSArray(value);
    } else if  (typeof value === 'object') {
      convertedValue = objectToNSDictionary(value);
    }
    return convertedValue;
  }).map(function(value){
    return value + ', ';
  });
  lines.unshift('[NSArray arrayWithObjects:');
  lines.push('nil]');
  return lines.join('');
}
function objectToNSDictionary(obj){
  var lines = _(obj).map(function(value,key){
    var convertedValue;
    if (_(value).isString()) {
      convertedValue = stringToNSString(value);
    } else if (_(value).isNumber()) {
      convertedValue = numberToNSNumber(value);
    } else if (_(value).isBoolean()) {
      convertedValue = booleanToNSNumber(value);
    } else if (_(value).isNull()) {
      convertedValue = nullToNSNull();
    } else if  (_(value).isArray()) {
      convertedValue = arrayToNSArray(value);
    } else if  (typeof value === 'object') {
      convertedValue = objectToNSDictionary(value);
    }
    return [convertedValue,stringToNSString(key)];
  }).map(function(valueKey){
    valueKey.push('');
    return valueKey.join(',');
  });
  lines.unshift('[NSDictionary dictionaryWithObjectsAndKeys:');
  lines.push('nil]');
  return lines.join('\n');
}
2 голосов
/ 19 апреля 2011

Поскольку вы можете предоставить только строку для -stringByEvaluatingJavaScriptFromString:, вам необходимо сериализовать ваши параметры.Простейшим способом было бы преобразовать его в JSON с помощью одной из различных библиотек Cocoa JSON.Затем он может быть вставлен в ваш код как литерал JavaScript.Что-то вроде:

NSString *json = [serialize JSON here];
NSString *scriptString = [NSString stringWithFormat:@"doSomething(%@)", json];

В JSON словари NSD будут представлены как объекты JavaScript, поэтому вы будете иметь доступ к их элементам как array[5].someKey (или array[5]["some key"]).

0 голосов
/ 14 февраля 2012

Я ЛОТ умнее сейчас ... ☺ и Я думаю - возможно , возможно ... , что это (JSONKit наGitHub) является лучшим решением .... JSONKit предоставляет следующие примитивные типы, сопоставленные со следующими классами Objective C:

╭───────────────┬─────────────────────╮
│  JSON         │  Objective -C       │
├───────────────┼─────────────────────┤
│  true|false   │  NSNull             │
├───────────────┼─────────────────────┤
│  Number       │  NSNumber           │   
├───────────────┼─────────────────────┤
│  String       │  NSString           │
├───────────────┼─────────────────────┤
│  Array        │  NSArray            │
├───────────────┼─────────────────────┤
│  Object       │  NSDictionary       │
╰───────────────┴─────────────────────╯

Объекты равны Associative Arrays,Key / Value Hash Tables, Maps или Dictionaries и т. Д.

JSONKit использует Core Foundation для внутреннего использования, и предполагается , что Core Foundation ≡ Foundation для каждого эквивалентного базового типа, т.е.CFString ≡ NSString.Также отметим, что они говорят это не ARC-безопасно.

...