Передача класса obj-c в javascript не работает. Что я делаю не так?

Я пишу некоторый внутренний код в javascript и планирую использовать собственный код для графического интерфейса. Это отлично работает в Android, но у меня есть некоторые проблемы с работой в Cocoa на Mac OS X. Я следовал учебнику по яблокам по этому вопросу, но он просто не работает. Позвольте мне попытаться объяснить это после того, как вы увидели код.

Индекс.html

<html>
<head>
    <script type="text/javascript">
        document.addEventListener("DOMContentLoaded", ready, false);

        function ready() {
            document.write(returnString());
            bridge.onBackendReady();
        }

        function returnString() {
            return "Hello World!!!!";
        }
    </script>
</head>
<body>

</body>
</html>

AppDelegate.m

#import "AppDelegate.h"
#import "BackendBridge.h"


@implementation AppDelegate

@synthesize webview;
@synthesize backend;


-(void)applicationDidFinishLaunching:(NSNotification *)notification
{
backend = [[BackendBridge alloc] init];

NSString *backendPath = [[NSBundle mainBundle] pathForResource:@"Index" ofType:@"html"];
NSURL *backendUrl = [NSURL fileURLWithPath:backendPath];

[[webview mainFrame] loadRequest:[NSURLRequest requestWithURL:backendUrl]];
[[webview windowScriptObject] setValue:backend forKey:@"bridge"];
}

@end

BackendBridge.m

#import "BackendBridge.h"


@implementation BackendBridge

-(void)onBackendReady
{
NSLog(@"Ready");
}

@end

Итак, то, что я пытаюсь сделать здесь, довольно просто. Вызовите функцию onBackendReady в классе BackendBridge из javascript. Из того, что я могу понять из API и учебника Apple WebView, это должен быть правильный способ сделать это, но он не работает (вызов NSLog не запускается). Я знаю, что функция javascript работает по назначению, так как в моем пользовательском интерфейсе я вижу строку «Hello World!!!!»...


person Robin Heggelund Hansen    schedule 06.03.2012    source источник
comment
Какую документацию Apple вы имеете в виду?   -  person ThomasW    schedule 06.03.2012
comment
Кроме того, знаете ли вы, вызывается ли метод applicationDidFinishLaunching:?   -  person ThomasW    schedule 06.03.2012


Ответы (2)


Комментарии в WebScriptObject.h говорят:

By default, no properties or functions are exported. A class must implement
+isKeyExcludedFromWebScript: and/or +isSelectorExcludedFromWebScript: to 
expose selected properties and methods, respectively, to JavaScript.

Может быть, добавить это к BackendBridge:

+ (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
{
    return selector != @selector(onBackendReady);
}
person Kurt Revis    schedule 06.03.2012

bridge_onBackendReady();

Используйте символы подчеркивания вместо . или :

person RandyMcMillan    schedule 16.03.2012
comment
это подчеркивание вместо: ... заменяя . с _ было бы очень, очень неправильно, поскольку onBackendReady является свойством объекта моста (точнее, объекта window.bridge), а не селектора. - person Robin Heggelund Hansen; 16.03.2012