2014-03-24 3 views
4

JavascriptCore는 iOS7에서 지원되는 새로운 프레임 워크입니다. JSExport 프로토콜을 사용하여 objc 클래스의 일부를 JavaScript에 노출 할 수 있습니다.JavascriptCore : JSExport의 매개 변수로 javascript 함수 전달

자바 스크립트에서 매개 변수로 함수를 전달하려고했습니다. 그냥 같이 :

자바 스크립트에서
@protocol FetchJsonForJS <JSExport> 
- (void)getJsonWithURL:(NSString *)URL 
       callback:(void (^)(NSString *json))callback; 
- (void)getJsonWithURL:(NSString *)URL 
     callbackScript:(NSString *)script; 
@end 

, viewController.getJsonWithURLCallbackScript 작동하지만, viewController.getJsonWithURLCallback이 작동하지 : 내 objc의 ViewController에서

function getJsonCallback(json) { 
     movie = JSON.parse(json) 
     renderTemplate() 
} 
viewController.getJsonWithURLCallback("", getJsonCallback) 

, 내 프로토콜을 정의했다.

JSExport에서 블록을 사용하는 실수가 있습니까? 고마워.

답변

6

문제는 NSString 인수를 취하는 Objective-C 블록으로 콜백을 정의했지만 javascript가이 작업을 수행하지 못하고 viewController.getJsonWithURLCallback ("", getJsonCallback) - 두 번째 매개 변수의 유형이 '정의되지 않음'이라고 생각합니다.

대신 콜백을 javascript 함수로 정의해야합니다.

JSValue를 사용하여 Objective-C에서이를 수행 할 수 있습니다. 거기에 다른 독자에 대한

, 여기 (예외 처리에) 완전한 작업 예제 :

TestHarnessViewController.h :

#import <UIKit/UIKit.h> 
#import <JavaScriptCore/JavaScriptCore.h> 

@protocol TestHarnessViewControllerExports <JSExport> 
- (void)getJsonWithURL:(NSString *)URL callback:(JSValue *)callback; 
@end 

@interface TestHarnessViewController : UIViewController <TestHarnessViewControllerExports> 
@end 

TestHarnessViewController.m : (복사를 사용하는 경우/붙여 넣기, evaluateScript 안에있는 개행 문자를 제거하십시오 - 이것들은 명확성을 위해 추가되었습니다) :

#import "TestHarnessViewController.h" 

@implementation TestHarnessViewController { 
    JSContext *javascriptContext; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    javascriptContext = [[JSContext alloc] init]; 
    javascriptContext[@"consoleLog"] = ^(NSString *message) { 
     NSLog(@"Javascript log: %@",message); 
    }; 
    javascriptContext[@"viewController"] = self; 

    javascriptContext.exception = nil; 
    [javascriptContext evaluateScript:@" 
     function getJsonCallback(json) { 
      consoleLog(\"getJsonCallback(\"+json+\") invoked.\"); 
      /* 
      movie = JSON.parse(json); 
      renderTemplate(); 
      */ 
     } 

     viewController.getJsonWithURLCallback(\"\", getJsonCallback); 
    "]; 
    JSValue *e = javascriptContext.exception; 
    if (e != nil && ![e isNull]) 
     NSLog(@"Javascript exception occurred %@", [e toString]); 
} 

- (void)getJsonWithURL:(NSString *)URL callback:(JSValue *)callback { 
    NSString *json = @""; // Put JSON extract from URL here 
    [callback callWithArguments:@[json]]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 
+0

감사합니다. 나는 JSValue를 사용하여 그것을 해결했다. – liaojinxing

+0

getJsonWithURLCallback (\ ", getJsonCallback) 자바 스크립트 호출 - (void) getJsonWithURL : (NSString *) URL 콜백 : (JSValue *) 콜백? 내가 이리저리 JSContext를 사용하여 자바 스크립트에서 두 개의 매개 변수가있는 함수를 호출하는 데 도움을 주시기 바랍니다. – jnix

+0

@jnix - 죄송합니다. 귀하의 의견을 이해하지 못했습니다. 아마도 새로운 질문을 게시해야합니다. – Mike