• 1.选中工程,点击右键,New File>在iOS下选中Othe>Empty,生成一个.js的脚本文件,将代码粘贴过去保存;

var script = document.createElement('script');
script.type = 'text/javascript';
script.text = '
function signin_go(){
location.href="ios:@signin_go";
}
';
document.getElementsByTagName('head')[0].appendChild(script);
  • 2.实现过程;
//
// ViewController.swift
// Swift_UIWebView
//
// Created by 周文春 on 16/3/1.
// Copyright © 2016年 周文春. All rights reserved.
// import UIKit class ViewController: UIViewController,UIWebViewDelegate { @IBOutlet weak var webView: UIWebView!
override func viewDidLoad() {
super.viewDidLoad() //加载网页
webView.loadRequest(NSURLRequest(URL: NSURL(string: "http://passport.cnblogs.com/user/signin")!))
webView.delegate = self
} //webView代理方法,链接地址发生改变的时候调用
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool{
//获取链接的地址
let rurl = request.URL?.absoluteString
//判断链接的前缀,是都包含ios:,就相当于OC中的判断网页跳转一样
if (rurl!.hasPrefix("ios:")){
//判断之后,因为js脚本里面链接是以@连接的location.href="ios:@signin_go"所以这里我们将链接进行分割之后取到后面的signin_go方法,用来调用我们重写OC中的方法
let method = rurl!.componentsSeparatedByString("@")[1]
if method == "signin_go"{
signin_go()
}
return false
}
return true
}
//webView代理方法,网页内容加载完成时调用
func webViewDidFinishLoad(webView: UIWebView){
/**
注入脚本
*/
//获取我们名为app.js的脚本路径
let jsPath = NSBundle.mainBundle().pathForResource("app", ofType: "js")
//获取到脚本中的内容
var jsString :String = try! String(contentsOfFile: jsPath!, encoding: 4)
//将获得的文本内容后面的\n替换为空的字符串
jsString = jsString.stringByReplacingOccurrencesOfString("\n", withString: "")
//触发脚本
webView.stringByEvaluatingJavaScriptFromString(jsString as String)
} func signin_go(){
NSLog("JS 调用了OC中的signin_go方法")
// //通过以下方法可以获得用户名或者密码等;
// var userName = webView.stringByEvaluatingJavaScriptFromString("脚本")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
} }
  • 3.点击网页中登录按钮,会调用OC中的signin_go方法;

参考原著出现的错误

  • 1.参考原著的时候,会提示以下错误;

解决方法: 在前面加上try! ;

  //获取到脚本中的内容
var jsString :String = try! String(contentsOfFile: jsPath!, encoding: 4)
  • 1
  • 2.encoding为0时,会提示以下错误信息,原因是编码格式错误;
2016-03-01 13:21:31.860 Swift_UIWebView[2292:905421] Incorrect NSStringEncoding value 0x0000 detected. Assuming NSASCIIStringEncoding. Will stop this compatiblity mapping behavior in the near future.
  • 1

解决方法:将encoding值设置为4,设置UTF8的编码格式即可;

参考:http://www.cnblogs.com/wuxian/p/4470634.html

Swift 实践之UIWebView的更多相关文章

  1. [iOS Hybrid实践:UIWebView中Html中用JS调用OC方法,OC执行JS代码]

    原理: 1.JS调用OC 每次webview执行跳转时都会被iOS给拦截,执行下面函数获得系统允许. 因此可以根据跳转信息转给系统,执行相应功能,比如打开相册等. // 网页中的每一个请求都会被触发 ...

  2. swift 实践- 08 -- UISegmentedControl

    import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoa ...

  3. swift - UISegmentedControl 和 UIWebView 的用法

    这两个用法比较简单: 具体代码如下: 一.UISegmentedControl 1.UISegmentedControl的声明 var segment = UISegmentedControl() 2 ...

  4. swift 实践- 14 -- UIScrollView

    import UIKit class ViewController: UIViewController ,UIScrollViewDelegate{ override func viewDidLoad ...

  5. swift 实践- 13 -- UIStepper

    import UIKit class ViewController: UIViewController { var stepper: UIStepper! var label: UILabel! ov ...

  6. swift 实践- 12 -- UIPickerView

    import UIKit class ViewController: UIViewController , UIPickerViewDelegate,UIPickerViewDataSource{ v ...

  7. swift 实践- 11 -- UISlider

    import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoa ...

  8. swift 实践- 10 -- UIProgressView

    import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoa ...

  9. swift 实践- 09 -- UIImageVIew

    import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoa ...

随机推荐

  1. 用来生成get set string 方法

    https://projectlombok.org/ 主要是用来生成get set string 方法等等 原理是注解

  2. py2exe打包OpenCV,找不到libiomp5md.dll

    问题:py2exe打包OpenCV,找不到libiomp5md.dll 解决方法:把 libiomp5md.dll 从numpy/core/ 里面复制到 python27/DLLS/文件夹!!!

  3. C++目录遍历:使用第三方库boost.filesystem等

    1. opencv 目录文件遍历 注释:2014 0814 这个代码是基于java的,Java使用托管代码进行目录管理,C++就不那么跨平台了. 原文链接:http://blog.csdn.net/z ...

  4. SQL2012安装

    SQL2012安装 1.打开SQL安装包,点击setup安装 2.选择安装界面,点击全新安装 3.验证通过后,点击确定 4.选择我接受,点击下一步 5.在外网环境,可进行在线更新,内网环境取消勾选产品 ...

  5. 路飞学城Python-Day171

    Evernote Export 线性结构: python的列表操作 列表是如何存储的:顺序存储的,是一块连续的内存,内存是一堆格子,列表是一串连续的编号 32位机器上一个整数占4个字节 数组和列表有2 ...

  6. python与图灵机器人交互(WXPY版本)

    开发者账号:wujunfeng , 开发者key:官网申请  #!/usr/bin/env python#-*- coding:utf-8 -*- @Author : wujf @Time:2018/ ...

  7. Centos 搭建activemq

    Centos 搭建activemq 1,官方下载  http://activemq.apache.org/activemq-5122-release.html apache-activemq-5.15 ...

  8. 自我介绍About me

    我的github:www.github.com/dcdcbigbig 欢迎来加star!(雾) tm就是个菜逼

  9. webpack学习笔记(2)--webpack.config.js

    3 模式 mode mode 参数设置为 development(开发模式), production(生产模式) 或 none(无),可以启用对应环境下 webpack 内置的优化.默认值为 prod ...

  10. 【模板】最大流模板(dinic)

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...