我有一个新的MacRuby应用程序。我正在尝试从应用程序内webView中加载的JavaScript调用MacRuby方法。
Calling Objective-C Methods From JavaScript教程显示了如何将密钥添加到webScriptObject中,该密钥的值是一个Objective-C对象。因此,您可以从JavaScript调用Obj-C方法。
不幸的是,这不适用于MacRuby类/方法。以下是WebView的loadDelegate的简化版本:
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)
返回字符串“ works”。
但是MacRuby实现失败。您打电话的时候:
window.MacRubyInstance.nameAtIndex_(1)
你得到:
表达式“ window.MacRubyInstance.nameAtIndex_”的结果[未定义]不是函数
在MacRuby实现中,永远不会调用
webScriptNameForSelector
和isSelectorExcludedFromWebScript
方法。我认为这就是问题所在,但我不知道为什么他们没有被召集。任何帮助将不胜感激。
最佳答案
我在this tutorial/blog post中展示了如何执行此操作。
我的猜测是,在您的情况下,以下代码是问题所在:
def self.isSelectorExcludedFromWebScript(sel)
if (sel == :nameAtIndex)
false
else
true
end
end
作为参数发送的选择器很可能不等于您放置的符号。尝试对所有人返回false,看看是否可行。尝试:
def self.isSelectorExcludedFromWebScript(sel); false end
另外,希望我的示例可以帮助您解决此问题。
关于javascript - 使用windowScriptObject和WebKit通过JavaScript调用MacRuby,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5229193/