Swift 實踐之UIWebView

來源:互聯網
上載者:User

標籤:int   java   包含   load   重寫   his   選中   apple   技術   

  • 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 UIKitclass 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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.