새로운 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_'의
결과를 [정의]를
webScriptNameForSelector
및 isSelectorExcludedFromWebScript
방법에 호출되지는 결코 기능하지 않습니다 MacRuby 구현. 그게 문제라고 생각하는데, 왜 그들이 전화를받지 못하는지 모르겠다.
도움을 주시면 감사하겠습니다.
멋진 게시물, 내 하루를 저장했습니다! 내가 발견 한 가장 큰 문제는 delegate가 ObjC의 webView : didFinishLoadForFrame이지만 didFinishLoadForFrame 매개 변수가있는 webView 인스턴스 메서드로 변환된다는 것입니다. – micho