将包含NSDictionary对象的NSArray传递给Javascript函数
我有一个需求,其中包含NSArray中包含NSDictionary对象的大量信息。现在我必须将它们传递到一个JavaScript函数通过使用网页视图:将包含NSDictionary对象的NSArray传递给Javascript函数
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
我的问题是:
- 我如何在主叫端,使JavaScript能够理解它准备我的论点?
- 我如何在Javascript中接收它们?基本上,函数签名应该是什么,以及如何读取java函数内数组的字典对象的键 - 值对?
我对javascript基本上没有足够的经验,所以请原谅我,如果这个问题太抽象了,我希望我的问题很清楚!
编辑:我来到across a thread其中规定传递NSDictionary对象到JavaScript函数是不可能的。那么,我们该如何实现呢?
感谢&问候, 拉吉
既然你只能到-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和字符串他们回来一起,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');
}
我是LOT聪明现在...☺和我认为 - 可能,也许... that this (JSONKit on 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使用核心基础,在内部,并且它假定该核心基础≡基金会每当量的碱的类型,即CFString字符串≡的NSString 。还要注意,他们说它不是ARC安全的。
完美,谢谢!那么,还有一件事,JavaScrip对象究竟是什么? – 2011-04-20 08:16:52