Quick-2dx [Luaoc.callStaticMethod 与 ios 交互]

先看廖大的文章:

http://dualface.github.io/blog/2013/01/27/call-objectivec-from-lua/

看完他的文章,感觉很模糊,幸好谷歌帮我找到了他的具体项目代码(在github上面)

分析学习一下代码:

luaoc的代码在player中运行,会提示找不到luaoc是不存在的。在iphone-simulator上面就可以正常找到的。

阅读完廖大的文章,开始着手实践。

(读完后,感觉跟luajavabridge差距很大的,因为在android中还需要调用什么线程切换的代码。

尝试了oc的这种调用,结果可以成功过调用到oc的代码中,所以说嘛,多动手,少瞎想。)

首先是在quick的lua文件的某个按钮中写上监听,

监听函数中的代码是:

local ok, ret = luaoc.callStaticMethod("ClassName","ClassMethod")

类名就是你创建objective-c类的名字,有2个文件.h、.m文件

比如有2个文件是MySdk.h、MySdk.mm 需要调用的方法是callMethod.就这样写:

local ok, ret = luaoc.callStaticMethod("MySdk","callMethod")

第三个参数不填,默认表示nil 不传递参数给oc.

如果需要传递参数到OC中的话,可以参考下面的棕色标注出来的方法。多个参数传递:

luaoc.callStaticMethod("ClassName","callFunction",{params1 = "abcd", params2 = 100})

+(void) callFunction:(NSDictionary *)dict{

  NSString *str = [[dict objectForKey:@"params1"]];

  int nums = [[dict objectForKey:@"params2"]intValue];

}

需要注意的是:lua调用oc的方法必须是类方法,也就是用'+'号表示的方法。不然调用会报错的。

然后在方法内就可以随意的调用ios下面的oc里的各种xxoo了。

-----------------------------------------------------

在方法中做好了你想要的xxoo后,把结果返回给lua代码。

我们需要在处理方法的时候加上luaoc的回调函数,不然oc不知道怎么回调了。

这样做:

--需要oc调用的lua函数

local function myLuaPrint(event)

  print("oc call lua success!"..event)   --你回调的时候使用的是pushString()

end

把方法作为oc调用lua的回调函数,这样写:

luaoc.callStaticMethod("ClassName","registerLuaHandler",{listener = myLuaPrint})

上面的类名就是你需要调用的类名,然后注册函数:registerLuaHandler必须要是(+)号的,不然同上一样,调用不起来,

代码实现应该这样:

+(void) registerLuaHandler:(NSDictionary *)dict{

  handlerID = [[dict objectForKey:@"listener"]intValue];

}

上面的代码做的事情是,记录lua传给oc的lua方法的id,然后oc就可以根据这个id来通过luastack来调用具体的lua方法了。

需要做的就是让oc记住这个handlerID,因为后面要将这个方法handlerID压栈,用来回调我们的lua函数。

这里的listener就是上面table表对应的myLuaPrint函数,我们要弄明白这点。

注册完成了,就是在Oc中xxoo后,回调的写法了:

需要注意的是将.m文件改成.mm文件,用来支持c++的写法。

导入头文件:

#import "cocos2d.h"

#import "CCLuaEngine.h"

#import "CCLuaBridge.h"

然后就是使用命名空间:

using namespace cocos2d;   //加在.mm文件的#import下面

然后就是调用的代码:

CCLuaBridge::pushLuaFunctionById(handlerID); //压入需要调用的方法id(假设方法为XG)

CCLuaStack *stack = CCLuaBridge::getStack();  //获取lua栈

stack->pushString("oc call lua method...");  //将需要通过方法XG传递给lua的参数压入lua栈

stack->executeFunction(1);  //根据压入的方法id调用方法XG,并把XG方法参数传递给lua代码

CCLuaBridge::releaseLuaFunctionById(handlerID); //最后记得释放一下function

ok~~~~不出意外,lua跟ios的相互矫情就完成了。

 

 

 

posted @ 2014-03-27 15:29  Mr轨迹  阅读(5579)  评论(1编辑  收藏  举报