通过WebScriptObject将Cocoa对象暴露给JS脚本环境

时间:2011-05-12 01:13:32

标签: javascript cocoa webkit

我看到有几个类似的问题,但这有点基础。

我试图通过WebScriptObject将一个简单的Cocoa对象暴露给WebView,希望允许页面向Cocoa对象发送消息。关于此的文档非常清楚,但由于某种原因,我无法让它工作。想知道你是否看看......

这是我正在加载到脚本环境中的Object。

@interface Client : NSObject {

     NSString *test;

}

@implementation Client

- (id)init {

    self = [super init];
    test = [[NSString alloc] initWithString:@"Hey Simon"];
    return self;

}

- (NSString *)test {

    return test;
}

然后我在WebView的frameLoad委托中加载该对象,其中包含:

- (void)webView:(WebView *)webView didClearWindowObject:(WebScriptObject *)windowObject forFrame:(WebFrame *)frame {

    Client *_client = [[Client alloc] init];
    [windowObject setValue:_client forKey:@"client"];

}

在JS方面,我只是在做一些非常基本的事情:

if( 'client' in window ) {

var client = window.client;

console.log( '---' );

console.log( 'client.test(): ' + client.test() );

console.log( '---' );

}

JS控制台说TypeError:表达式'client.test'[undefined]的结果不是函数。

有几件事。我知道对象正在被正确加载到脚本环境中,因为它不会通过条件加我可以看到描述:

console.log( 'Client object: ' + client )

但我只是不知道如何正确地公开我的可可方法。看看我上面所说的,我是如何在我的类中实现方法或在JS中调用它们有一些问题?

提前致谢, 艾力

1 个答案:

答案 0 :(得分:2)

它就在文档中。 :(

您必须在传入的对象上实现+(BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector。

所以在我的情况下,我不得不写

+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector

{
    if (aSelector == @selector(test)) return NO;
    return YES;
}