Cómo JSExport un método Objective-C con object

Quiero escribir un método por Objective-C que se puede exportar a JavaScript, para que pueda get el object JavaScript en el código nativo. Por ejemplo, en el siguiente código: someObject es un object implementado nativo y su método es divertido.

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

Sé que usar JSExport puede exportar el método nativo a JavaScript. y pasa satisfactoriamente la cadena JavaScript al código nativo ( NSString* ). Pero cuando quiero pasar el object JavaScript a nativo, falla.

Como resolver esto

Muchas gracias

Además de la conversión de cadenas JavaScript a NSString * como ya ha observado, los objects JavaScript se copyn en un object objective C-compatible con KVC (esencialmente, una instancia de NSDictionary) antes de pasar a su método objective-c.

Por ejemplo, con las siguientes definiciones:

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

y la initialization de su JSContext de la siguiente manera:

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

entonces tu fun:(id)param método fun:(id)param puede acceder a los campos k y k2 de los objects como este:

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

Además de ste3veh contesta.

Puede usar la macro JSExportAs de la siguiente manera para exportar el método Objective-C como 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 

En este caso, el param se convertiría implícitamente en el -[JSValue toObject] Objective-C correspondiente, usando -[JSValue toObject] . En tu caso, se convertirá en NSDictionary . Para evitar la conversión implícita, puede especificar el parámetro como 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 

Tenga en count que los grandes objects JavaScript, es decir, la window o el document , son muy costosos de convertir en los correspondientes Objective-C, por lo que se prefiere la segunda vía. Además, puede usar el parámetro JSValue para devolver los methods JavaScript de este object desde Objective-C, usando callWithArguments:

No creo que puedas. Consulte el encabezado JSExport.h : define qué pueden ser los arguments, y no parece que se puedan pasar objects JavaScript generics.