読者です 読者をやめる 読者になる 読者になる

onthewavesのコードスニペット

SwiftやObjective-Cを中心にiPhoneアプリ開発に関するコードスニペットを書きます。

コードスニペット (UIWebView編)

UIWebViewのコードスニペット

よく使いそうなメソッドをExtension化しました。

import UIKit

extension UIWebView {
    
    /**
     UIWebViewを表示する(サーバーのファイル)
     */
    func open(urlString: String) {
        self.loadRequest(NSURLRequest(URL: NSURL(string: urlString)!))
    }
    
    /**
     UIWebViewを表示する(ローカルファイル)
     */
    func openLocalFile(fileName: String, ofType: String) {
        
        let path: NSString = NSBundle.mainBundle().pathForResource(fileName, ofType:ofType)!
        self.open(path as String)
    }

    /**
     ユーザーエージェントの取得
    */
    func userAgent() -> String {
        return self.stringByEvaluatingJavaScriptFromString("navigator.userAgent") ?? ""
    }

    /**
     ユーザーエージェントの変更
     */
    func updateUserAgent(str: String) {

        if let userAgent = self.stringByEvaluatingJavaScriptFromString("navigator.userAgent") {
            
            let customUserAgent = userAgent.stringByAppendingString(" \(str)")
            let dic = ["UserAgent" : customUserAgent]
            NSUserDefaults.standardUserDefaults().registerDefaults(dic)
        }
    }

    /**
     JSの関数を呼ぶ(戻り値なし)
    */
    func jsFunc(jsString: String) {
        self.stringByEvaluatingJavaScriptFromString(jsString)
    }

    /**
     JSの関数を呼ぶ(戻り値あり)
    */
    func jsFuncCallBack(jsString: String) -> NSDictionary? {
        let result = self.stringByEvaluatingJavaScriptFromString(jsString)
        if let resultData = result?.dataUsingEncoding(NSUTF8StringEncoding) {
            return try! NSJSONSerialization.JSONObjectWithData(resultData, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary
        }
        return nil
    }
    
    /**
     ページ内アンカー移動
    */
    func internalAnchor(request: NSURLRequest, anchorName: String) {
        
        let names = request.URL?.absoluteString.componentsSeparatedByString("#")
        jsFunc("window.location.hash = \"\(names?.first!)\"")
    }
}

UIWebViewのDelegateをクラス化しました。

import UIKit

typealias WebViewDidFinishLoad = (UIWebView) -> ()
typealias WebViewDidStartLoad = (UIWebView) -> ()
typealias WebViewDidFailLoadWithError = (UIWebView, NSError?) -> ()

class WebViewDelegate: NSObject, UIWebViewDelegate {
    
    var webViewDidFinishLoad: WebViewDidFinishLoad?
    var webViewDidStartLoad: WebViewDidStartLoad?
    var webViewDidFailLoadWithError: WebViewDidFailLoadWithError?
    
    func setupWebViewDidFinishLoad(webViewDidFinishLoad: WebViewDidFinishLoad) {
        self.webViewDidFinishLoad = webViewDidFinishLoad
    }
    
    func setupWebViewDidStartLoad(webViewDidStartLoad: WebViewDidStartLoad) {
        self.webViewDidStartLoad = webViewDidStartLoad
    }
    
    func setupWebViewDidFailLoadWithError(webViewDidFailLoadWithError: WebViewDidFailLoadWithError) {
        self.webViewDidFailLoadWithError = webViewDidFailLoadWithError
    }
    
    //MARK: - UIWebViewDelegate
    //Pageがすべて読み込み終わった時呼ばれるデリゲートメソッド.
    func webViewDidFinishLoad(webView: UIWebView) {
        
        if webViewDidFinishLoad != nil{
            
            if let block = webViewDidFinishLoad {
                block(webView)
            }
        }
    }
    
    //Pageがloadされ始めた時、呼ばれるデリゲートメソッド.
    func webViewDidStartLoad(webView: UIWebView) {
        
        if webViewDidStartLoad != nil{
            
            if let block = webViewDidStartLoad {
                block(webView)
            }
        }
    }
    
    func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
        
        if webViewDidFailLoadWithError != nil{
            
            if let block = webViewDidFailLoadWithError {
                block(webView, error)
            }
        }
    }
}

外部HTMLファイルを読みには、

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var webView: UIWebView!
    var webViewDelegate =  WebViewDelegate()
    let requestURL = "http://www.apple.com/jp/iphone-6s/"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setup()
    }
    
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)        
        webView.open(requestURL)
    }

    func setup() {
        
        webViewDelegate.setupWebViewDidStartLoad { (webView) -> () in
            print(__FUNCTION__)
        }
        
        webViewDelegate.setupWebViewDidFinishLoad { (webview) -> () in
            print(__FUNCTION__)            
        }
        
        webViewDelegate.setupWebViewDidFailLoadWithError { (WebView, error) -> () in
            print(error)
        }
        webView.delegate = webViewDelegate
    }
}

ローカルHTMLファイルを読むには

    webView.openLocalFile("index", ofType: "html")

HTMLを直接書くには、

    func createHTML() -> String {
        
        let sMessage  = "Hello"
        let sMeta     = "<meta name=\"viewport\" content=\"initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no\">";
        let sStyle    = "<style>html,body{background-color:#eaeae9;}p{font-size:14px;font-weight:bold;width:80%;marg

in:50px auto;}</style>";
        let sHtmlHead = "<head>" + sMeta + sStyle + "</head>";
        let sHtmlBody = "<body><p>" + sMessage + "</p></body>";
        return  "<html>" + sHtmlHead + sHtmlBody + "</html>";
    }

    webView.loadHTMLString(createHTML(), baseURL: nil)