99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

JavaScript與Objective-C互相調(diào)用的方法

發(fā)布時間:2016-08-27 23:19  回復(fù):0  查看:2465   最后回復(fù):2016-08-27 23:19  

之前自己閑著無聊寫過幾個套用網(wǎng)頁的皮包軟件,其實像這樣的皮包軟件也可以做得很高端大氣的,通過WebKit實現(xiàn)的OC-JS Bridge,可以非常方便的實現(xiàn)在JS中調(diào)用OC的方法/OC中調(diào)用JS的方法。如此一來,便可以通過web實現(xiàn)炫麗的UI,而通過原生API實現(xiàn)與本地相關(guān)的操作。希望這篇文章對學(xué)習(xí)Objective-C的同學(xué)有所幫助。

 

1、JS中變量在OC中的類型
通過OC-JS Bridge,變量的類型會自動進(jìn)行轉(zhuǎn)換,基本類型都會自動轉(zhuǎn)換,如JS中的number、boolean都會轉(zhuǎn)換成OC中的NSNumber類型,而String類型會自動轉(zhuǎn)換成NSString類型,JS中的對象會轉(zhuǎn)換成WebScriptObject對象,而相關(guān)的屬性信息可以通過Key-Value的方法讀取和寫入,本文后面可看到相關(guān)的代碼。


2、實現(xiàn)在OC中調(diào)用JS方法
OC中調(diào)用JS方法是非常方便的,WebView有一個windowScriptObject屬性,可以直接獲得腳本對象,然后便可以調(diào)用callWebScriptMethod:withArguments將消息轉(zhuǎn)發(fā)給JS中對象的方法和參數(shù),對于簡單的方法調(diào)用你也可以直接通過WebView的方法stringByEvaluatingJavaScriptFromString去執(zhí)行一段JS代碼,并返回字符串。示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

//在OC中的調(diào)用
- (void)ocAction:(id)sender
{
    NSArray *args = @[@"Hello,JS!"];
    id result = [[webView windowScriptObject] callWebScriptMethod:@"JSFunction" withArguments:args];
    NSLog(@"%@",result);
}
//在JS中對應(yīng)的方法
function JSFunction(parameter)
{
    //顯示OC返回的值
    alert(parameter);
    
    //返回成功的消息
    return 'Web程序已經(jīng)收到消息!';
}

3、實現(xiàn)JS調(diào)用OC的方法
通過設(shè)置webViewframeLoadDelegate,在– webView:didClearWindowObject:forFrame:回調(diào)方法中,指定一個本地對象(該對象實現(xiàn)WebScripting協(xié)議),然后JS中就可以直接調(diào)用該對象的相關(guān)方法。
OC中的代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

//該方法用于JS中調(diào)用
- (WebScriptObject *)status:(WebScriptObject *)jsObject
{
    //將JS發(fā)過來的信息顯示出來
    NSString *message = [jsObject valueForKey:@"message"];
    NSLog(@"%@",message);
    
    //返回成功的信息(WebScriptObject對象不能自己創(chuàng)建,所以此處復(fù)用了傳入的參數(shù))
    [jsObject setValue:@"本地端已經(jīng)收到消息啦!" forKey:@"message"];
    return jsObject;
}

#pragma mark -
#pragma mark WebFrameLoadDelegate

//通過此回調(diào),將self傳遞給JS環(huán)境
- (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowObject forFrame:(WebFrame *)frame
{
    [windowObject setValue:self forKey:@"native"];
}

#pragma mark -
#pragma mark WebScriptingProtocol

/*
 返回是否阻止響應(yīng)該方法,
 返回NO即能響應(yīng)該方法
 */
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
{
    if (selector == @selector(status:))
    {
        return NO;
    }
    return YES;
}

/*
 返回本地方法在JS中的名稱(不實現(xiàn)此方法,則JS中方法名與OC中相同)
 */
+ (NSString *)webScriptNameForSelector:(SEL)sel
{
    if (sel == @selector(status:))
    {
        return @"ocMethod";
    }
    return nil;
}

JS中代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12

function CallNative()
{
    if (native)
    {
        //將消息組裝成對象發(fā)給OC
        var parameter = {'message':'Hello,Objective-C!'};
        var result = native.ocMethod(parameter);
        
        //顯示OC返回的結(jié)果
        alert(result['message']);
    }
}

 

 

文章來自:博客園/紫風(fēng).

您還未登錄,請先登錄

熱門帖子

最新帖子

?