我正在使用WebScripting
响应。WebScriptObject
从我的 WebApp 到 ObjC 界面进行通信,反之亦然。
我也可以在 JS 对象上调用方法。这很好用。任何返回的对象都将转换为 ObjC 类型,如NSArray
or NSDictionary
。
现在我想发送一个对象。在 JavaScript 中,我会这样做:
external.processDict({a: 1, b: 2, c: 3});
但是我怎样才能使用 ObjC 做到这一点?文档说:
/*!
@method callWebScriptMethod:withArguments:
@param name The name of the method to call in the script environment.
@param arguments The arguments to pass to the script environment.
@discussion Calls the specified method in the script environment using the specified arguments.
@result Returns the result of calling the script method.
Returns WebUndefined when an exception is thrown in the script environment.
*/
- (id)callWebScriptMethod:(NSString *)name withArguments:(NSArray *)arguments;
这根本没有帮助。这arguments
是一组“传递给脚本环境的参数”。文档说“传递给方法的值” 。
至于什么?!苹果?香蕉?NSObject
或者什么样的?
当我传递一个字典(例如我使用 WebScripting 协议收到的字典)时,我得到一个ObjCRuntimeObject
没有值和键的空类型对象。
那么如何将数组和/或字典发送到环境中呢?
到目前为止我尝试了什么:
+ (id)_parseObject:(id)object {
if ([object isKindOfClass:[NSArray class]]) {
return [self webScriptObjectForArray:object];
}
else if ([object isKindOfClass:[NSDictionary class]]) {
return [self webScriptObjectForDctionary:object];
}
else if ([object respondsToSelector:@selector(stringValue)]) {
return [object stringValue];
}
return [NSString stringWithFormat:@"%@", object];
}
+ (WebScriptObject *)webScriptObjectForDctionary:(NSDictionary *)dictionary {
dictionary = [dictionary copy];
WebScriptObject *object = [[WebScriptObject alloc] init];
for (NSString *key in [dictionary allKeys]) {
[object setValue:[self _parseObject:[dictionary objectForKey:key]] forKey:key];
}
return object;
}
+ (WebScriptObject *)webScriptObjectForArray:(NSArray *)array {
array = [array copy];
WebScriptObject *object = [[WebScriptObject alloc] init];
for (int i = 0; i < [array count]; i++) {
[object setValue:[self _parseObject:[array objectAtIndex:i]] forKey:[NSString stringWithFormat:@"%@", @(i)]];
}
return object;
}
但我不能设置那个的对象值WebScriptObject
,我总是得到EXC_BAD_ACCESS
。
编辑我
我发现使用NSArray
我得到一个数组。那么如何使用字典呢?