質問編集履歴

1 質問内容に追記しました。

aoshima.natsuki

aoshima.natsuki score 31

2016/05/02 12:33  投稿

swift2.xでWKWebViewにプログレスバーを付けたい
質問させてください。swift2.xでのストーリーボードを使わないWKWebViewの実装についてです。
現在、1ページだけの起動後に表示される画面に特定のwebページが表示させるだけのサンプルアプリをつくっています。WKWebViewのtitle、loading、estimatedProgressを監視対象に入れプログレスバーを設置する設定をしているのですが、どうやってもプログレスバーが表示されずに困っており3日ほど詰まってしまって前に進めない状況なのでなんとか解決できないかと思い、質問させていただきました。titleの設定やスワイプで前の画面に戻る動作、プログレスの値(0.0-1.0)を取得してコンソールに出力させるまではだいたい理解して実装ができています。
viewDidLoadの `// プログレスバーを設定する` あたりが間違っているのかなと思いいろいろ試しているのですがどうやってもプログレスバーが出てきません。どうかよろしくお願いいたします。
viewDidLoadの `// プログレスバーを設定する` あたりが間違っているのかなと思いいろいろ試しているのですがどうやってもプログレスバーが出てきません。
また、監視対象の解除について、 `viewWillDisappear` で解除すべきか `deinit` で解除すべきかで迷っております。こちらについてもお詳しい方がおられましたら教えていただけますととても嬉しいです。どうかよろしくお願いいたします。
```swift
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
   
   var webkitview: WKWebView?
   var progressView: UIProgressView!
   override func viewDidLoad() {
       super.viewDidLoad()
       // Do any additional setup after loading the view, typically from a nib.
       // ヘッダーにタイトルを設定する
       self.navigationItem.title = "Home"
       
       // WebKitのインスタンスをつくる
       self.webkitview = WKWebView()
       
       // WebKitをviewに紐付ける
       self.view = self.webkitview!
       
       // 表示する内容を設定する
       let url = NSURL(string: "https://www.nintendo.co.jp")
       let req = NSURLRequest(URL: url!)
       self.webkitview!.loadRequest(req)
       
       // スワイプで戻る動作を設定する
       self.webkitview!.allowsBackForwardNavigationGestures = true
       
       // プログレスバーを設定する
       self.webkitview!.navigationDelegate = self
       progressView = UIProgressView(frame: CGRectMake(0, self.navigationController!.navigationBar.frame.size.height, self.view.frame.size.width, 10))
       progressView.progressTintColor = UIColor.greenColor()
       progressView.trackTintColor = UIColor.whiteColor()
       progressView.layer.position = CGPoint(x:0, y:(self.navigationController?.navigationBar.frame.size.height)!)
       progressView.transform = CGAffineTransformMakeScale(1.0, 2.0)
       self.navigationItem.titleView?.addSubview(progressView)
   }
   
   deinit {
       // 監視対象を解除する
       webkitview!.removeObserver(self, forKeyPath: "estimatedProgress")
       webkitview!.removeObserver(self, forKeyPath: "loading")
       webkitview!.removeObserver(self, forKeyPath: "title")
   }
   override func didReceiveMemoryWarning() {
       super.didReceiveMemoryWarning()
       // Dispose of any resources that can be recreated.
   }
   
   override func viewWillAppear(animated: Bool) {
       // 監視対象を登録する
       self.webkitview!.addObserver(self, forKeyPath: "estimatedProgress", options: .New, context: nil)
       self.webkitview!.addObserver(self, forKeyPath: "loading", options: .New, context: nil)
       self.webkitview!.addObserver(self, forKeyPath: "title", options: .New, context: nil)
   }
   
   override func viewWillDisappear(animated: Bool) {
       // 監視対象を解除する
       self.webkitview!.removeObserver(self, forKeyPath: "estimatedProgress")
       self.webkitview!.removeObserver(self, forKeyPath: "loading")
       self.webkitview!.removeObserver(self, forKeyPath: "title")
   }
   override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
       if(keyPath == "estimatedProgress") {
           let progress : Float = Float(webkitview!.estimatedProgress)
           if(progressView != nil) {
               if(progress < 1.0) {
                   // プログレスバーを更新する
                   print("loaded:\(progress)")
                   progressView.setProgress(progress, animated: true)
                   UIApplication.sharedApplication().networkActivityIndicatorVisible = true
               } else {
                   // 読み込みが完了したらプログレスバーを消す
                   print("loaded:done")
                   progressView.setProgress(0.0, animated: false)
                   UIApplication.sharedApplication().networkActivityIndicatorVisible = false
               }
           }
       } else if(keyPath == "title") {
           // タイトルにページのタイトルを設定する
           let title = self.webkitview!.title
           self.navigationItem.title = title
       }
   }
}
```
  • Swift 2

    1346 questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る