如何在IOS平臺上使用js直接調用OC方法(轉)

在Cocos2d-JS v3.0 RC2中,與Android上js調用Java一樣,Cocos2d-JS也提供了在iOS和Mac上js直接調用Objective-C的方法,示例代碼如下:

var ret = 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,其余的類型暫時不支持。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容