将包含 NSDictionary 对象的 NSArray 传递给 Javascript 函数

发布于 2024-11-02 02:21:12 字数 611 浏览 1 评论 0原文

我有一个要求,其中包含 NSDictionary 对象的 NSArray 中有大量信息。现在我必须通过 webview 将它们传递到 javascript 函数中,使用:

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

我的问题是:

  1. 如何在调用者端准备我的参数以便 Javascript 理解它?
  2. 我如何在 Javascript 中接收它们?基本上,函数签名应该是什么以及如何读取java函数内部数组的字典对象的键值对?

我对Javascript基本上没有足够的经验,所以如果这个问题太抽象请原谅我,但我希望我的问题很清楚!

编辑:我来到跨线程< /a> 表明将 NSDictionary 对象传递给 javascript 函数是不可能的。那么,我们怎样才能实现呢?

谢谢&问候, 拉吉

I have a requirement wherein I have huge set of information in a NSArray which contains NSDictionary objects. Now I have to pass them into a javascript function through a webview using:

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

My questions are:

  1. How do I prepare my arguments at the caller end so that Javascript understands it?
  2. How do I receive them in Javascript? Basically, what should be the function signature and how do I read the key-value pairs of dictionary objects of the array inside java function?

I basically do not have enough experience when it comes to Javascript, so forgive me if this question is too abstract, I hope that my question is clear though!

Edit: I came across a thread which states that passing NSDictionary objects to javascript functions is not possible. So, how can we achieve it?

Thanks & Regards,
Raj

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

千仐 2024-11-09 02:21:12

由于您只能向 -stringByEvaluatingJavaScriptFromString: 提供字符串,因此您需要序列化您的参数。最简单的方法是使用各种 Cocoa JSON 库之一将其转换为 JSON。然后可以将其作为 JavaScript 文本插入到您的代码中。类似于:

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

在 JSON 中,NSDictionaries 将表示为 JavaScript 对象,因此您可以通过 array[5].someKey(或 array[5]["some key “])。

Since you can only provide a string to -stringByEvaluatingJavaScriptFromString:, you need to serialize your parameters. The simplest way would be to convert it to JSON using one of the various Cocoa JSON libraries. This can then be inserted in your code as a JavaScript literal. Something like:

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

In the JSON, the NSDictionaries will be represented as JavaScript Objects, so you’d access their members as array[5].someKey(or array[5]["some key"]).

尸血腥色 2024-11-09 02:21:12

你也可以把它们撕开,然后把它们串起来,看起来这家伙就是正在做....

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');
}

You could also rip'em'apart and string 'em back together, like it looks this guys is doing....

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');
}
本宫微胖 2024-11-09 02:21:12

我现在很多聪明了...☺并且我认为 - 可能,也许...这个(GitHub 上的 JSONKit) 是一个更好的解决方案...... JSONKit 提供了映射到以下 Objective-C Foundation 类的以下原始类型:

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

对象关联数组键/值哈希表
MapsDictionaries 等。JSONKit

在内部使用 Core Foundation,并且假设对于每个等效的基本类型,Core Foundation == Foundation,即CFString == NSString。另请注意,他们它不是 ARC 安全的。

I'm a LOT smarter now... ☺ and I think - possibly, maybe... that this (JSONKit on GitHub) is a better solution.... JSONKit provides the following primitive types mapped to the following Objective-C Foundation classes:

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

Objects are Associative Arrays, Key / Value Hash Tables,
Maps, or Dictionaries, etc.

JSONKit uses Core Foundation, internally, and it is assumed that Core Foundation ≡ Foundation for every equivalent base type, i.e. CFString ≡ NSString. Also to note, they say it is not ARC-safe.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文