如何用对象JSExport一个Objective-C方法

时间:2014-11-07 07:12:38

标签: ios objective-c javascriptcore

我想通过Objective-C编写一个可以导出到JavaScript的方法,这样我就可以将JavaScript Object转换为本机代码。例如,在以下代码中:someObject是本机实现的对象,其方法很有趣。



someObject.fun({ k : 'value1', k2 : 'value2'})




我知道使用JSExport可以将本机方法导出到JavaScript。并成功将JavaScript String传递给本机代码(NSString*)。但是,当我想将JavaScript对象传递给本机时,它会失败。

如何解决这个问题?

非常感谢

3 个答案:

答案 0 :(得分:1)

除了已经观察到的将javascript字符串转换为NSString *之外,在传递给objective-c方法之前,Javascript对象被复制到符合KVC的objective-C对象(实质上是NSDictionary实例)。

例如,使用以下定义:

@protocol MyJSAPI
- (void)fun:(id)param;
@end
@interface MyObject: NSObject<MyJSAPI>
- (void)fun:(id)param;
@end

和JSContext的初始化如下:

myjscontext[@"someObject"] = [[MyObject alloc] init];
[myjscontext evaluateScript:@"someObject.fun({ k : 'value1', k2 : 'value2'});

然后,您的fun:(id)param方法可以访问对象的kk2字段,如下所示:

@implementation MyObject
- (void)fun:(id)param {
   NSString* k = [param valueForKey:@"k"];
   NSString* k2 = [param valueForKey:@"k2"];
   NSLog(@"k = %@, k2 = %@", k, k2);
}
@end

答案 1 :(得分:0)

除了ste3veh的回答。

您可以按照以下方式使用JSExportAs宏将Objective-C方法导出为JavaScript:

@interface MyObject: NSObject <JSExport>
JSExportAs(fun,
- (void)fun:(id)param
);
@end

@implementation MyObject

- (void)fun:(id)param {
    NSString* k = [param objectForKey:@"k"];
    NSString* k2 = [param objectForKey:@"k2"];
    NSLog(@"k = %@, k2 = %@", k, k2);
}

@end

在这种情况下,param将使用-[JSValue toObject]隐式转换为相应的Objective-C oblect。在您的情况下,它将在NSDictionary中转换。要避免隐式转换,您可以将参数指定为JSValue

@interface MyObject: NSObject <JSExport>
JSExportAs(fun,
- (void)fun:(JSValue*)param
);
@end

@implementation MyObject

- (void)fun:(JSValue*)param {
    NSString* k = [[param valueForProperty:@"k"] toString];
    NSString* k2 = [[param valueForProperty:@"k2"] toString];
    NSLog(@"k = %@, k2 = %@", k, k2);
}

@end

请注意,大型JavaScript对象(即windowdocument)转换为相应的Objective-C对象非常昂贵,因此第二种方式更受欢迎。此外,您可以使用JSValue参数使用callWithArguments:从Objective-C回调此对象的JavaScript方法。

答案 2 :(得分:-1)

我认为你不能。请参阅JSExport.h标题:它定义了参数可以是什么,并且看起来不会传递通用JavaScript对象。