轉自:http://cocos2d-x.org/docs/manual/framework/html5/v3/reflection-oc/zh
在Cocos2d-JS v3.0 RC2中,與Android上js調用Java一樣,Cocos2d-JS也提供了在iOS和Mac上js直接調用Objective-C的方法,示例代碼如下:
var ojb = jsb.reflection.callStaticMethod(className, methodNmae, arg1, arg2, .....);
在jsb.reflection.callStaticMethod
方法中,我們通過傳入OC的類名,方法名,參數就可以直接調用OC的靜態方法,並且可以獲得OC方法的返回值。
類
- 參數中的類名,只需要傳入OC中的類名即可,與Java不同,類名並不需要路徑。比如你在工程底下新建一個類
NativeOcClass
,只要你將他引入工程,那么他的類名就是NativeOcClass
,你並不需要傳入它的路徑。
import <Foundation/Foundation.h> @interface NativeOcClass : NSObject +(BOOL)callNativeUIWithTitle:(NSString *) title andContent:(NSString *)content; @end
方法
- js到OC的反射僅支持OC中類的靜態方法。
- 方法名比較要需要注意,我們需要傳入完整的方法名,特別是當某個方法帶有參數的時候,你需要將他的**:**也帶上。根據上面的例子。此時的方法名字是**callNativeUIWithTitle:andContent:**,不要漏掉了他們之間的**:**。
- 如果是沒有參數的函數,那么他就不需要**:**,如下代碼,他的方法名是
callNativeWithReturnString
,由於沒有參數,他不需要**:**,跟OC的method寫法一致。
+(NSString *)callNativeWithReturnString;
使用示例
- 下面的示例代碼將調用上面
NativeOcClass
的方法,在js層我們只需要這樣調用:
var ret = jsb.reflection.callStaticMethod("NativeOcClass", "callNativeUIWithTitle:andContent:", "cocos2d-js", "Yes! you call a Native UI from Reflection");
- 這里是這個方法在OC的實現,可以看到是彈出一個native的對話框。並把
title
和content
設置成你傳入的參數,並返回一個boolean類型的返回值。
+(BOOL)callNativeUIWithTitle:(NSString *) title andContent:(NSString *)content{ UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title message:content delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil]; [alertView show]; return true; }
- 此時,你就可以在
ret
中接受到從OC傳回的返回值(true)了。
注意
在OC的實現中,如果方法的參數需要使用float、int、bool的,請使用如下類型進行轉換:
- float,int 請使用NSNumber類型
- bool請使用BOOL類型。
- 例如下面代碼,我們傳入2個浮點數,然后計算他們的合並返回,我們使用NSNumber而不是int、float去作為參數類型。
+(float) addTwoNumber:(NSNumber *)num1 and:(NSNumber *)num2{ float result = [num1 floatValue]+[num2 floatValue]; return result; }
- 目前參數和返回值支持 int, float, bool, string,其余的類型暫時不支持。