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的相互矯情就完成了。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM