• JS与OC中的方法相互调用


    文章主要是介绍oc如何调用js 以及js的代码调用oc的方法 

    先上代码后做解释

    //oc的.m 的代码

    //ps接下来有js的代码一并解析,最后会附上demo

    //  ViewController.m

    //  JSAndOC

    //

    //  Created by dongqiangfei on 16/7/21.

    //  Copyright © 2016年 dongqiangfei. All rights reserved.

    //

    #import "ViewController.h"

    #import <JavaScriptCore/JavaScriptCore.h>

    @interface ViewController ()<UIWebViewDelegate>

    @property(nonatomic,strong)UIWebView *webView;

    @end

    @implementation ViewController

    - (void)viewDidLoad {

        [super viewDidLoad];

        [self makeBtn];

        [self makeWeb];

        // Do any additional setup after loading the view, typically from a nib.

    }

    -(void)makeBtn

    {

        UIButton *thisBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

        thisBtn.frame = CGRectMake(100, 100, 140, 40);

        [thisBtn addTarget:self action:@selector(ocCallJS) forControlEvents:UIControlEventTouchUpInside];

        [thisBtn setTitle:@"点击oc调用js" forState:UIControlStateNormal];

        [self.view addSubview:thisBtn];

    }

    -(void)ocCallJS

    {

        [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"showTitleMessage('%@')",@"oc调用了js的内容"]];

    }

    -(void)makeWeb

    {

        self.webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 200, self.view.frame.size.width, self.view.frame.size.height - 200)];

        self.webView.backgroundColor = [UIColor whiteColor];

        self.webView.scalesPageToFit = YES;

        self.webView.delegate = self;

        

        NSString *webPath = [[NSBundle mainBundle] pathForResource:@"ocandjs" ofType:@"html"];

        NSURL *webURL = [NSURL fileURLWithPath:webPath];

        NSURLRequest *URLRequest = [[NSURLRequest alloc] initWithURL:webURL];

        [self.webView loadRequest:URLRequest];

        [self.view addSubview:self.webView];

        

        JSContext *content = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

        content[@"bdgt"] = ^() {

            NSLog(@"js调用oc---------begin--------");

            NSArray *thisArr = [JSContext currentArguments];

            for (JSValue *jsValue in thisArr) {

                NSLog(@"=======%@",jsValue);

            }

            //JSValue *this = [JSContext currentThis];

            //NSLog(@"this: %@",this);

            NSLog(@"js调用oc---------The End-------");

            [self.webView stringByEvaluatingJavaScriptFromString:@"show();"];

        };

    }

    - (void)didReceiveMemoryWarning {

        [super didReceiveMemoryWarning];

        // Dispose of any resources that can be recreated.

    }

    @end

    //js的代码

    <html>

        <!--描述网页信息-->

        <head>

            <meta charset="UTF-8"/>

            <title>iOS上webView与JS交互的之oc调用js的demo</title>

            <script>

                function show()

                {

                    alert('js调用了oc的代码');

                }

                function showTitle()

                {

                    alert(document.title);

                }

                function showTitleMessage(message)

                {

                    alert(message);

                }

                function repost()

                {

                    location.href = "http://www.iosxxx.com";

                }

                function sum()

                {

                    return 1 + 1;

                }

                function btnClick()

                {

                    bdgt("hello world");

    <!--xmg://sendMessageWithNumber_andContent_?10086&love-->

                    location.href = "xmg://callWithNumber_?15830654880";

                }

            </script>

        </head>

        <!--网页具体内容-->

        <body>

            <br>下面是网页</br><br/>

            <button style = "background: yellow; height: 150px; 350px;" onclick = "btnClick();">点击按钮js调用oc</button>

        </body>

    </html>

    解析oc调用js的方法

    知道的这么一种方法如下:

    [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"showTitleMessage('%@')",@"oc调用了js的内容"]];

    对应

    function showTitleMessage(message)

    或者

    [self.webView stringByEvaluatingJavaScriptFromString:@"show();"];

    对应

    function show()           

    这个方法都对应js的相应的方法.如上

    使用oc调动js 注意写法如:

    [NSString stringWithFormat:@"showTitleMessage('%@')",@"oc调用了js的内容"]不能写成

    [NSString stringWithFormat:@"showTitleMessage(%@)",@"oc调用了js的内容"],否则调不起.

    js调用  oc 的方法

    这个主要是指的点击网页上的特定的方法调用原生的的特定方法 这个有一种简单粗暴地方法,不懂得名字, 就是直接吊起的如

    -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

    {

        if ([[NSString stringWithFormat:@"%@",request.URL] isEqualToString:@"特定的连接"]) {

            NSLog(@"吊起oc的方法");

        }

        return NO;//不加载网页

        return YES;//加载网页

    }

    直接在点击网页的某个方法加载网页之前,在代理中拿到将要加载的网页,去做相应的判断.最早就是这样做,也有局限性吧,但是这样感觉比单纯的js调用原生效率要高点.

    接下来言归正传介绍正宗的js如何调用oc

    如下核心方法也就这么点

    JSContext *content = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

        content[@"bdgt"] = ^() {

            NSLog(@"js调用oc---------begin--------");

            NSArray *thisArr = [JSContext currentArguments];

            for (JSValue *jsValue in thisArr) {

                NSLog(@"=======%@",jsValue);

            }

            //JSValue *this = [JSContext currentThis];

            //NSLog(@"this: %@",this);

            NSLog(@"js调用oc---------The End-------");

            [self.webView stringByEvaluatingJavaScriptFromString:@"show();"];

        };

     本文摘自iOS攻城狮:http://www.cnblogs.com/godlovexq/p/5691942.html

  • 相关阅读:
    计数排序
    epel
    Web开发:我希望得到的编程学习路线图
    第五章:if语句与运算符
    java web学习建议
    第四章:c++数据类型
    第二章:做一个最简单的c++程序
    linux的商业应用
    第三章:初步了解函数
    解析Linux商业应用现状
  • 原文地址:https://www.cnblogs.com/pengoeng/p/6073179.html
Copyright © 2020-2023  润新知