コードスニペット (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)