簡體   English   中英

將包含NSDictionary對象的NSArray傳遞給Javascript函數

[英]Passing NSArray containing NSDictionary objects to Javascript function

我有一個要求,其中我在包含NSDictionary對象的NSArray中有大量信息。 現在我必須通過webview將它們傳遞到javascript函數中:

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

我的問題是:

  1. 如何在調用者端准備我的參數,以便Javascript理解它?
  2. 我如何在Javascript中收到它們? 基本上,應該是什么函數簽名,如何在java函數中讀取數組的字典對象的鍵值對?

我基本上沒有足夠的經驗談到Javascript,所以請原諒我,如果這個問題太抽象,我希望我的問題很清楚!

編輯:我遇到一個線程 ,聲明將NSDictionary對象傳遞給javascript函數是不可能的。 那么,我們怎樣才能實現呢?

感謝和問候,Raj

由於您只能為-stringByEvaluatingJavaScriptFromString:提供字符串, -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"] )訪問。

你也可以rip'em'apart並將它們串起來, 就像看起來這些家伙正在做的......

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

我是一個聰明很多 ,現在...☺ 我認為 - 可能 ,也許...... 這(JSONKit在GitHub上)是一個更好的解決方案.... JSONKit提供映射到以下Objective-C的基礎下面的基本類型類別:

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

對象Associative ArraysKey / Value Hash TablesMapsDictionaries等。

JSONKit在內部使用Core Foundation,並假設 CoreFoundation≡Foundation用於每個等效的基本類型,即CFString≡NSString。 還要注意,他們說它不是ARC安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM