[英]Passing NSArray containing NSDictionary objects to Javascript function
我有一個要求,其中我在包含NSDictionary對象的NSArray中有大量信息。 現在我必須通過webview將它們傳遞到javascript函數中:
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
我的問題是:
我基本上沒有足夠的經驗談到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 Arrays
, Key / Value Hash Tables
, Maps
或Dictionaries
等。
JSONKit在內部使用Core Foundation,並假設 CoreFoundation≡Foundation用於每個等效的基本類型,即CFString≡NSString。 還要注意,他們說它不是ARC安全的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.