Вызов MacRuby через JavaScript с помощью windowScriptObject и WebKit - PullRequest
0 голосов
/ 08 марта 2011

У меня новое приложение 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.Я думаю, что это проблема, но я не знаю, почему им не звонят.

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 21 марта 2011

Я показал, как это сделать в этом уроке / посте в блоге .

Я предполагаю, что в вашем случае проблема заключается в следующем коде:

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

Селектор, отправленный в качестве аргумента, скорее всего, не равен символу, который вы положили. Попробуйте вернуть false для всех и посмотреть, работает ли это. Попробуйте:

def self.isSelectorExcludedFromWebScript(sel); false end

Также, надеюсь, мой пример поможет вам решить эту проблему.

...