cocos creator oc调用js里面的方法,方法名怎么写

2赞

接入微信登录的ios版SDK啊

比如一个js是abc.js,js里面的内容如下
cc.Class({
extends: cc.Component,
properties: {
},
onLoad: function() {
},
weChatCallBack: function(a, b) {
}
}
我现在想要在oc里面调用weChatCallBack这个方法,我写的是这个
cocos2d::StringUtils::format(“weChatCallBack(”%s","%s");", a.c_str(), b.c_str());
se::ScriptEngine::getInstance()->evalString(jsCallStr.c_str());
但是xCode里面返回没有weChatCallBack方法

顶一下,没人么

weChatCallBack是一个类的方法,首先你得new出一个对象,才能去调用这个方法,你可以把这个函数做成全局的,应该就可以调用了

全局的是可以,我试了,如果我不写全局的,写在Class里面的方法,我要怎么写

这。。。。面向对象最基本的知识啊。。。
var a = new MyClass();
a.weChatCallBack(“a”, “b”);
或者你把这个类写成一个单例

oc里面没这个写法,我现在是想通过evalString调用js的Class方法,
把weChatCallback写成window的全局方法
cocos2d::StringUtils::format(“weChatCallBack(”%s","%s");", a.c_str(), b.c_str());
se::ScriptEngine::getInstance()->evalString(jsCallStr.c_str());
是成功的调到了全局weChatCallback里面东西
如果我不把js里的weChatCallback放到全局,我现在js的文件就是
cc.Class({
extends: cc.Component,
properties: {
},
onLoad: function() {
},
weChatCallBack: function(a, b) {
}
}
weChatCallback在Class里面

你应该没明白我的意思,而且你对cocos实现的这一套js的面向对象应该还不是太了解,我上边就是一句js代码,跟oc没关系,evalString就是执行一句js代码

你想调用对象的一个方法,首先你得new出一个对象啊

你不会说要这样写吧
evalString(“var a = new MyClass();a.weChatCallBack(“a”, “b”);”);

我只是给你提供了一个生成对象的办法,具体这个对象是写成单例,还是写到一个对象管理器里,就得你自己去决定了,因为我也不知道你调用这个对象的方法,是要干什么

也就是说evalString()里面传的都是js代码了

你是想做跟java和oc一样的反射机制吗?

我现在想做微信登录的
我点击按钮,js调用oc AppController里的callWeChat方法,发送微信登录请求,跳转微信

这一步成功了,


oc里面接收到微信返回的onResp:(BaseResp*)resp,在里面请求openId和accessToken,我也拿到了,我现在拿到了这2个东西,我要从oc里面把这2个东西传回js里面,通过调用se::ScriptEngine::getInstance()->evalString(“xxxx”);
但是我卡在这一步,如果把WEChatCallback放到全局里
可以成功,不是全局的,evalString里面的字符串怎么写,没搞明白

2赞

evalString就是执行了一句js代码,建议写一个中间件,去控制这个native通信问题

直接当js写成功了,不用全局也行

1赞

我也是搞微信登陆时候遇到了这个问题,折腾了1天,除了你这个方法,也可以这样写:
NSString * sendValue = [NSString stringWithFormat:@“require(‘nativeEventDispatch’).onWeixinEvent()”];

if (std::this_thread::get_id() == Director::getInstance()->getCocos2dThreadId())
{
    se::ScriptEngine::getInstance()->evalString([sendValue UTF8String]);
}
else
{
    Director::getInstance()->getScheduler()->performFunctionInCocosThread([=](){
        se::ScriptEngine::getInstance()->evalString([sendValue UTF8String]);
    });
}

script这个参数本质是执行一段js代码,所以把自己想要的模块require就好了。 可惜没有任何文档把这个定义解释清楚,好多还是误导的,让人以为是按照:模块.函数名 这种方式来调用。

1赞

反正当js写就是对的,具体怎么写,就要看你想怎么实现,全局调用方法,用模块调用方法,类里调用方法等等,写完了全部用“”包起来通过evalString传递,不然为何叫做oc调用js

这种情况我比较喜欢用通知的形式,直接在oc里执行"cc.game.emit(‘xxx’)"

1赞