質問させてください。swift2.xでのストーリーボードを使わないWKWebViewの実装についてです。
現在、1ページだけの起動後に表示される画面に特定のwebページが表示させるだけのサンプルアプリをつくっています。WKWebViewのtitle、loading、estimatedProgressを監視対象に入れプログレスバーを設置する設定をしているのですが、どうやってもプログレスバーが表示されずに困っており3日ほど詰まってしまって前に進めない状況なのでなんとか解決できないかと思い、質問させていただきました。titleの設定やスワイプで前の画面に戻る動作、プログレスの値(0.0-1.0)を取得してコンソールに出力させるまではだいたい理解して実装ができています。
viewDidLoadの // プログレスバーを設定する
あたりが間違っているのかなと思いいろいろ試しているのですがどうやってもプログレスバーが出てきません。
また、監視対象の解除について、 viewWillDisappear
で解除すべきか deinit
で解除すべきかで迷っております。こちらについてもお詳しい方がおられましたら教えていただけますととても嬉しいです。どうかよろしくお願いいたします。
swift
1import UIKit 2import WebKit 3 4class ViewController: UIViewController, WKNavigationDelegate { 5 6 var webkitview: WKWebView? 7 var progressView: UIProgressView! 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 // Do any additional setup after loading the view, typically from a nib. 12 13 // ヘッダーにタイトルを設定する 14 self.navigationItem.title = "Home" 15 16 // WebKitのインスタンスをつくる 17 self.webkitview = WKWebView() 18 19 // WebKitをviewに紐付ける 20 self.view = self.webkitview! 21 22 // 表示する内容を設定する 23 let url = NSURL(string: "https://www.nintendo.co.jp") 24 let req = NSURLRequest(URL: url!) 25 self.webkitview!.loadRequest(req) 26 27 // スワイプで戻る動作を設定する 28 self.webkitview!.allowsBackForwardNavigationGestures = true 29 30 // プログレスバーを設定する 31 self.webkitview!.navigationDelegate = self 32 progressView = UIProgressView(frame: CGRectMake(0, self.navigationController!.navigationBar.frame.size.height, self.view.frame.size.width, 10)) 33 progressView.progressTintColor = UIColor.greenColor() 34 progressView.trackTintColor = UIColor.whiteColor() 35 progressView.layer.position = CGPoint(x:0, y:(self.navigationController?.navigationBar.frame.size.height)!) 36 progressView.transform = CGAffineTransformMakeScale(1.0, 2.0) 37 self.navigationItem.titleView?.addSubview(progressView) 38 } 39 40 deinit { 41 // 監視対象を解除する 42 webkitview!.removeObserver(self, forKeyPath: "estimatedProgress") 43 webkitview!.removeObserver(self, forKeyPath: "loading") 44 webkitview!.removeObserver(self, forKeyPath: "title") 45 } 46 47 override func didReceiveMemoryWarning() { 48 super.didReceiveMemoryWarning() 49 // Dispose of any resources that can be recreated. 50 } 51 52 override func viewWillAppear(animated: Bool) { 53 // 監視対象を登録する 54 self.webkitview!.addObserver(self, forKeyPath: "estimatedProgress", options: .New, context: nil) 55 self.webkitview!.addObserver(self, forKeyPath: "loading", options: .New, context: nil) 56 self.webkitview!.addObserver(self, forKeyPath: "title", options: .New, context: nil) 57 } 58 59 override func viewWillDisappear(animated: Bool) { 60 // 監視対象を解除する 61 self.webkitview!.removeObserver(self, forKeyPath: "estimatedProgress") 62 self.webkitview!.removeObserver(self, forKeyPath: "loading") 63 self.webkitview!.removeObserver(self, forKeyPath: "title") 64 } 65 66 override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 67 if(keyPath == "estimatedProgress") { 68 let progress : Float = Float(webkitview!.estimatedProgress) 69 if(progressView != nil) { 70 if(progress < 1.0) { 71 // プログレスバーを更新する 72 print("loaded:\(progress)") 73 progressView.setProgress(progress, animated: true) 74 UIApplication.sharedApplication().networkActivityIndicatorVisible = true 75 } else { 76 // 読み込みが完了したらプログレスバーを消す 77 print("loaded:done") 78 progressView.setProgress(0.0, animated: false) 79 UIApplication.sharedApplication().networkActivityIndicatorVisible = false 80 } 81 } 82 } else if(keyPath == "title") { 83 // タイトルにページのタイトルを設定する 84 let title = self.webkitview!.title 85 self.navigationItem.title = title 86 } 87 } 88}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/02 07:25 編集
2016/05/02 07:45 編集
2016/05/02 08:39
2016/05/02 09:41 編集
2016/05/02 10:19
2016/05/02 10:50 編集