新しい 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_' [未定義] の結果は関数ではありません
webScriptNameForSelector
andisSelectorExcludedFromWebScript
メソッドが MacRuby 実装で呼び出されることはありません。それが問題だと思いますが、なぜ彼らが呼び出されないのかわかりません。
どんな助けでも大歓迎です。