天天看點

iOS javascrip和oc混編 互相調用

一.OC調用javascrip

今天在做項目時,要求将html資料用網頁控件顯示出來,給出的html資料是

<p><img src="/uploads/ueditor/1466598011338154.jpg" style="" title="1466598011338154.jpg"/></p><p><img src="/uploads/ueditor/1466598011168049.jpg" style="" title="1466598011168049.jpg"/></p><p><br/></p><p><img src="/uploads/ueditor/1466598011419605.jpg" style="" title="1466598011419605.jpg"/></p><p><img src="/uploads/ueditor/1466598011981633.jpg" style="" title="1466598011981633.jpg"/></p><p><br/></p>
           

最終做出來的效果是

iOS javascrip和oc混編 互相調用

首先,建立一個html文檔。

iOS javascrip和oc混編 互相調用
<html>
    <head>
        <meta charset = "UTF-8">
            
            <script type="text/javaScript">
                
                //這個方法将html寫入body中
                function postStr(str1){
                    document.write(str1);
                }
            
                //這個方法設定圖檔的格式
                function widthFit(width1)
                {
                    //擷取所有的圖檔imgs數組
                    var imgs=document.getElementsByTagName('img');
                    for(i=0;i <imgs.length;i++){
                        var src = imgs[i].src;
                        //添加http字首
                        if(src.substr(0,4)!='http')
                        {
                            src = src.substr(7);
                            imgs[i].src = 'http://114.55.231.81/meigou'+src;
                        }
                        //設定圖檔的寬度為螢幕寬度
                        imgs[i].width = width1;
                    };
                }
            </script>

    </head>

    <body>
        //需要将傳入的資料添加到此,是以要oc調用兩個script方法;
           
//方法function postStr(str1)講資料寫入
           
//方法function widthFit(width1)設定資料的格式
    </body>
</html>
           

要加載html網頁,需要用到UIWebView;

拖入一個webView,

在ViewController.m中設定好webView代理,并調用html中的JavaScript方法;

#import "ViewController.h"

#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width

@interface ViewController ()<UIWebViewDelegate,NSURLSessionDelegate>
//拖入的webView
@property (weak, nonatomic) IBOutlet UIWebView *webView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //設定webView代理
    self.webView.delegate = self;
    //設定webView url路徑
    NSURL *url = [[NSBundle mainBundle]URLForResource:@"index" withExtension:@"html"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //webView 加載請求
    [self.webView loadRequest:request];
}

#pragma mark -- 這是webView的代理方法 當網頁加載完後執行
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
    //需要加載的html資料,從網絡接口擷取,這裡舉例直接寫
    NSString *str1 = @"<p><img src=\"http://114.55.231.81/meigou/uploads/ueditor/1478241505114807.jpg\" style=\"\" title=\"1478241505114807.jpg\"/></p><p><img src=\"http://114.55.231.81/meigou/uploads/ueditor/1478241505421988.jpg\" style=\"\" title=\"1478241505421988.jpg\"/><img src=\"http://114.55.231.81/meigou/uploads/ueditor/1478241572708383.jpg\" title=\"1478241572708383.jpg\" alt=\"20161104_141649_002.jpg\"/></p><p><img src=\"http://114.55.231.81/meigou/uploads/ueditor/1478241506884794.jpg\" style=\"\" title=\"1478241506884794.jpg\"/></p><p><br/></p>";
    
    //調用html中的第一個js方法,寫入資料
    [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"postStr('%@');",str1]];
    
    //調用html中的第二個js方法,設定格式,圖檔的寬度為螢幕寬度
    [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"widthFit('%f');",SCREENWIDTH]];
 }

@end
           

當web網頁加載完後,會自動調用index.html中的兩個JavaScript方法。

二.JavaScript調用OC

      同樣在html中,我們先寫一個button,button的點選事件是一個JavaScript方法。這個方法中調用window.location.href 來打開一個URL頁面。

     在oc中,用UIwebView的的一個代理方法,來擷取到window.location.href要打開的URL字元串,判斷該字元串後可以進行一系列的操作。

    index.html

<html>
    <head>
        <meta charset = "UTF-8">
    </head>
       <body>
           <button onclick = "getImage();">通路相冊</button>
           <script>
               function getImage()
               {
                   window.location.href = "xw://getImage";
               }
           </script>
       </body>
       
</html>
           

ViewController.m

#import "ViewController.h"

@interface ViewController ()<UIWebViewDelegate>
@property (weak, nonatomic) IBOutlet UIWebView *webView;
@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSURL *url = [[NSBundle mainBundle]URLForResource:@"index" withExtension:@"html"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [self.webView loadRequest:request];
}

#pragma mark -- 操作網頁
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString *str = request.URL.absoluteString;
    NSLog(@"%@",str);
    if([str isEqualToString:@"xw://getImage"])
    {
        [self getImage];
    }
    return YES;
}

- (void)getImage
{
    //這是被調用的方法
    NSLog(@"這是被調用的方法");
}

@end
           

如此就可以在JavaScript中調用到oc的方法了。

繼續閱讀