2011-04-19 91 views
1

我有一個需求,其中包含NSArray中包含NSDictionary對象的大量信息。現在我必須將它們傳遞到一個JavaScript函數通過使用網頁視圖:將包含NSDictionary對象的NSArray傳遞給Javascript函數

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

我的問題是:

  1. 我如何在主叫端,使JavaScript能夠理解它準備我的論點?
  2. 我如何在Javascript中接收它們?基本上,函數簽名應該是什麼,以及如何讀取java函數內數組的字典對象的鍵 - 值對?

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

編輯:我來到across a thread其中規定傳遞NSDictionary對象到JavaScript函數是不可能的。那麼,我們該如何實現呢?

感謝&問候, 拉吉

回答

2

既然你只能到-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"])。

+0

完美,謝謝!那麼,還有一件事,JavaScrip對象究竟是什麼? – 2011-04-20 08:16:52

2

你也可以rip'em'apart和字符串他們回來一起,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'); 
} 
0

我是LOT聰明現在...☺和我認爲 - 可能,也許... that this (JSONKit on GitHub)是一個更好的解決方案.... JSONKit提供以下基本類型映射到以下Objective-C基礎類:

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

對象Associative ArraysKey/Value Hash TablesMaps,或Dictionaries

JSONKit使用核心基礎,在內部,並且它假定該核心基礎≡基金會每當量的鹼的類型,即CFString字符串≡的NSString 。還要注意,他們它不是ARC安全的。