2011-03-08 2 views
0

새로운 MacRuby 응용 프로그램이 있습니다. 응용 프로그램 내에서 webView에로드 된 JavaScript에서 MacRuby 메서드를 호출하려고합니다.JavaScript를 통해 WindowScriptObject 및 WebKit을 사용하여 MacRuby 호출

Calling Objective-C Methods From JavaScript 자습서는 값이 Objective-C 개체 인 webScriptObject에 키를 추가하는 방법을 보여줍니다. 따라서 JavaScript에서 Obj-C 메소드를 호출 할 수 있습니다.

불행히도 MacRuby 클래스/메소드에서는 작동하지 않습니다. ObjCInstance 및 MacRubyInstance 다음 webScriptObject 내가 그것을 두 개의 키를 추가 사용할 수있는 경우

class WebLoadDelegate 

attr_accessor :objc_bridge, :mr_bridge 

def webView(sender, windowScriptObjectAvailable:windowScriptObject) 
    scriptObject = windowScriptObject 

    self.mr_bridge = MacRubyBridge.new(); 
    self.objc_bridge = JavaScriptBridge.instance(); 

    scriptObject.setValue(self.objc_bridge, forKey:"ObjCInstance") 
    scriptObject.setValue(self.mr_bridge, forKey:"MacRubyInstance") 
end 

end 

: 다음은 내 웹보기의 loadDelegate의 Lite 버전의 버전입니다. 루비에서 같은 일을해야하는데 무슨 여기

#import "JavaScriptBridge.h" 

static JavaScriptBridge *gInstance = NULL; 

@implementation JavaScriptBridge 

+ (JavaScriptBridge *)instance { 
    gInstance = [[self alloc] init]; 

    return gInstance; 
} 

+ (NSString *) webScriptNameForSelector:(SEL)sel 
{  
    return @"nameAtIndex"; 
} 

+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector 
{ 
    if (aSelector == @selector(nameAtIndex:)) return NO; 
    return YES; 
} 

- (NSString *)nameAtIndex:(int)index { 
    return @"works"; 
} 


@end 

그리고 :

다음은 ObjC 클래스의 구현입니다

class MacRubyBridge 

    def nameAtIndex(i) 
     return "fails" 
    end 

    def self.webScriptNameForSelector(sel) 
     return "nameAtIndex"; 
    end 


    def self.isSelectorExcludedFromWebScript(sel) 
     if (sel == :nameAtIndex) 
      false 
     else 
      true 
     end 
    end 

end 

유일한 문제는 오브젝티브 C 구현이 잘 작동합니다. JS 측에서는 다음을 호출 할 수 있습니다.

window.ObjCInstance.nameAtIndex_(1) 

문자열은 "작동합니다"를 반환합니다.

하지만 MacRuby 구현이 실패합니다. 전화 할 때 :

window.MacRubyInstance.nameAtIndex_(1) 

를 당신이 얻을 : 표현 'window.MacRubyInstance.nameAtIndex_'의

결과를 [정의]를

webScriptNameForSelectorisSelectorExcludedFromWebScript 방법에 호출되지는 결코 기능하지 않습니다 MacRuby 구현. 그게 문제라고 생각하는데, 왜 그들이 전화를받지 못하는지 모르겠다.

도움을 주시면 감사하겠습니다.

답변

2

this tutorial/blog post에서 그 방법을 보여 줬습니다. 선택기 인수로 전송

def self.isSelectorExcludedFromWebScript(sel) 
    if (sel == :nameAtIndex) 
     false 
    else 
     true 
    end 
    end 

보다 기호 같지 않은 것보다는 아마 당신 넣어 :

내 생각 엔 귀하의 경우, 다음과 같은 코드는 문제가 있다는 것입니다. 모든 사람들에게 거짓을 돌려 주면서 그것이 작동하는지 확인하십시오. 시도해보십시오.

def self.isSelectorExcludedFromWebScript(sel); false end 

또한 제 예제가이 문제를 해결하는 데 도움이됩니다.

+0

멋진 게시물, 내 하루를 저장했습니다! 내가 발견 한 가장 큰 문제는 delegate가 ObjC의 webView : didFinishLoadForFrame이지만 didFinishLoadForFrame 매개 변수가있는 webView 인스턴스 메서드로 변환된다는 것입니다. – micho