У меня новое приложение MacRuby.Я пытаюсь вызвать метод MacRuby из JavaScript, загруженного в веб-представление в приложении.
Вызов методов Objective-C из JavaScript В руководстве показано, как добавить ключ в webScriptObject, которыйзначение является объектом Objective-C.Таким образом, вы можете вызывать методы Obj-C из JavaScript.
К сожалению, это не работает с классами / методами MacRuby.Ниже приведена сокращенная версия loadDelegate моего WebView:
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
Когда доступен webScriptObject, я добавляю к нему два ключа: ObjCInstance и MacRubyInstance.
Вот реализация класса ObjC:
#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
И вот что должно быть то же самое в Ruby:
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
Единственная проблема - реализация Objective-C работает нормально.На стороне JS вы можете позвонить:
window.ObjCInstance.nameAtIndex_(1)
, который возвращает строку «работает».
Но реализация MacRuby не работает.При вызове:
window.MacRubyInstance.nameAtIndex_(1)
Вы получите:
Результат выражения 'window.MacRubyInstance.nameAtIndex_' [undefined] не является функцией
* 1031Методы
webScriptNameForSelector
и
isSelectorExcludedFromWebScript
никогда не вызываются в реализации MacRuby.Я думаю, что это проблема, но я не знаю, почему им не звонят.
Любая помощь будет принята с благодарностью.