先看廖大的文章:
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的相互矫情就完成了。