zoukankan      html  css  js  c++  java
  • 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的相互矫情就完成了。

  • 相关阅读:
    Ocelot网关
    .Net Configuration配置优先级问题
    FilterContext/HttpContext 获取请求参数
    关于.Net的文件上传问题
    Notion+Zetero文献同步配置
    PyTorch训练模版
    marked ASP.NET 页面对象模型
    转:jQuery设计思想
    tryParse, try/catch(Parse), Convert比较
    CSS3 :nthchild()伪类选择器
  • 原文地址:https://www.cnblogs.com/vokie/p/3628458.html
Copyright © 2011-2022 走看看