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