luaoc.callStaticMethod實(shí)現(xiàn)OC和lua的相互調(diào)用(cocos2d)

cocos2d-x技術(shù)群新群:117871561
c++技術(shù)交流群:593010226
callStaticMethod方法的原型是:

-- 調(diào)用Objective-C類的接口。  
-- @function [parent=#luaoc] callStaticMethod  
-- @param string className Objective-C類名  
-- @param string methodName Objective-C類方法名  
-- @param table args Objective-C類方法所需要的各種參數(shù)字典,key值為方法的參數(shù)名  
-- @return boolean#boolean ret (return value: bool)  ok, mixed ret ok為是否調(diào)用成功, ok為true時,ret為Objective-C方法的返回值,ok為false時,ret為出錯原因   
function luaoc.callStaticMethod(className, methodName, args)    
end  
  1. lua調(diào)用OC方法

OC代碼OCClass類中一個方法:

+ (NSString *)getNum:(NSDictionary *)dic {  
      
    return @"111";  
}  

那么,lua代碼要調(diào)用getNum這個方法的話,需要這樣實(shí)現(xiàn):

local luaoc = require "cocos.cocos2d.luaoc"
local arg1 = {callBack = LGfunc}  
local arg2 = {types = 1,maxCount = 4,original = 1}  
local OCClass = "AppController"
result, version = luaoc.callStaticMethod(“OCClass”, “getNum”, arg1)  

OCClass就是要調(diào)用的類名
getNum就是方法名
arg1和arg2是傳遞給oc的參數(shù),arg1這樣寫是為了讓oc回調(diào)lua的LGfunc函數(shù),后面詳細(xì)講。arg2是以字典(oc中稱字典)的形式給oc傳遞參數(shù),這里要注意的是,types,maxCount這些都不帶雙引號“”的。
這樣,在控制臺就可以看到打印出了 “111”,這就意味著lua調(diào)用OC函數(shù)成功了。
要注意的是:OC里被調(diào)用方法必須是類方法,也就是前面是“+”號的方法!

  1. OC調(diào)用lua方法
    在上面所講的lua中的代碼實(shí)際上已經(jīng)把自己的LGfunc方法的ID通過參數(shù)arg1傳遞給了OC的getNum方法。這時,只需要修改getNum方法為:

+ (NSString *)getNum:(NSDictionary *)dic {  
    int handlerID = (int)[[dic objectForKey:@"callBack"] integerValue];  
    LuaBridge::pushLuaFunctionById(handlerID); //壓入需要調(diào)用的方法id(假設(shè)方法為XG)  
    LuaStack *stack = LuaBridge::getStack();  //獲取lua棧  
    stack->pushString("oc call lua method...");  //將需要通過方法XG傳遞給lua的參數(shù)壓入lua棧  
    stack->executeFunction(1);  //根據(jù)壓入的方法id調(diào)用方法XG,并把XG方法參數(shù)傳遞給lua代碼  
    LuaBridge::releaseLuaFunctionById(handlerID); //最后記得釋放  
    return @"111";  
}  

并且要在OC的這個類中引入:

#import "cocos2d.h"  
#import "CCLuaEngine.h"  
#import "CCLuaBridge.h"  
using namespace cocos2d;  

需要注意的是:將.m文件改成.mm文件,用來支持c++的寫法。
如果lua中的LGFunc函數(shù)如下:

local function LGfunc()  
    print("callBack succeed")  
end   

那么在控制臺就可以看見打印"callBack succeed"。

但是,上面的例子中,OC調(diào)用lua是基于lua調(diào)用OC的基礎(chǔ)上,如果lua不調(diào)用OC,那么OC貌似就沒辦法主動調(diào)用lua函數(shù)?我們不難發(fā)現(xiàn),只要OC得到lua函數(shù)的id(也就是上面例子中的handleID),就可以調(diào)用。
所以,如果你知道以后要調(diào)用lua的哪個方法,就提前把這個方法的id傳給OC,然后在需要的時候,OC就可以直接調(diào)用lua的方法了。

3.OC向lua傳遞形參
OC在調(diào)用lua函數(shù)的時候,如果lua的函數(shù)是個帶形參的函數(shù),怎么辦?先上代碼:

+ (NSString *)getNum:(NSDictionary *)dic {  
    int handlerID = (int)  
    [[dic objectForKey:@"callBack"] integerValue];  
    LuaBridge::pushLuaFunctionById(handlerID); //壓入需要調(diào)用的方法id(假設(shè)方法為XG)  
    //下面三行是重點(diǎn)  
    cocos2d::CCLuaValue item = cocos2d::CCLuaValue::intValue((int)button.tag);//包裝要傳遞的參數(shù)  
    cocos2d::CCLuaBridge::getStack()->pushCCLuaValue(item);//參數(shù)壓棧  
    cocos2d::CCLuaBridge::getStack()->executeFunction(1);//括號里面的1 是告訴lua傳遞的形參是1個  
  
    stack->executeFunction(1);  //根據(jù)壓入的方法id調(diào)用方法XG,并把XG方法參數(shù)傳遞給lua代碼  
    LuaBridge::releaseLuaFunctionById(handlerID); //最后記得釋放  
    return @"111";  
}  

注釋很清楚了。如果要傳多個參數(shù),用json字符串傳:

cocos2d::CCLuaValue item = cocos2d::CCLuaValue::stringValue([@"lalala" UTF8String];  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容