0

新しい MacRuby アプリケーションがあります。アプリケーション内の webView に読み込まれた JavaScript から MacRuby メソッドを呼び出そうとしています。

Calling Objective-C Methods From JavaScriptチュートリアルは、値が Objective-C オブジェクトである webScriptObject にキーを追加する方法を示しています。したがって、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 の 2 つのキーを追加します。

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_' [未定義] の結果は関数ではありません

webScriptNameForSelectorandisSelectorExcludedFromWebScriptメソッドが MacRuby 実装で呼び出されることはありません。それが問題だと思いますが、なぜ彼らが呼び出されないのかわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

2

このチュートリアル/ブログ投稿でその方法を示しました。

私の推測では、あなたの場合、次のコードが問題です。

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

引数として送信されたセレクターは、入力したシンボルと等しくない可能性が高くなります。すべてに対して false を返してみて、それが機能するかどうかを確認してください。試す:

def self.isSelectorExcludedFromWebScript(sel); false end

また、私の例がこの問題の解決に役立つことを願っています。

于 2011-03-21T05:33:02.213 に答える