我有一个新的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)


你得到:

表达式“ wi​​ndow.MacRubyInstance.nameAtIndex_”的结果[未定义]不是函数

在MacRuby实现中,永远不会调用webScriptNameForSelectorisSelectorExcludedFromWebScript方法。我认为这就是问题所在,但我不知道为什么他们没有被召集。

任何帮助将不胜感激。

最佳答案

我在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/

10-11 01:40