RxWebKit을 사용하여 WKWebView의 로딩 처리 (프로그레스 바 업데이트 등)를 좋은 느낌

개요


  • RxWebKit라는 라이브러리를 사용하여 WKWebView 로딩 프로세스의 UI 업데이트 주위를 좋은 느낌으로 쓰는 방법을 소개합니다.

  • RxSwift를 사용하여 WKWebView의 로딩 프로세스를 잘 느낍니다. 기사 계속

  • 이미지





    리포지토리


  • 공식
  • htps : // 기주 b. 코 m / Rx ぃft

  • 샘플
  • htps : // 기주 b. 코 m / 료 타카 하시 / W 쿠 ぇ b ぃ ぃ 에 wRx


  • 환경


  • Xcode 9.4
  • Swift 4.1
  • RxSwift 4.2
  • RxCocoa 4.2
  • RxOptional 3.5.0

  • 환경 구축



    Podfile
      pod 'RxSwift'
      pod 'RxCocoa'
      pod 'RxOptional'
      pod 'RxWebKit'
    

    화면




  • 화면 구성
  • WKWebView
  • Progress View


  • 코드


    
    import UIKit
    import WebKit
    import RxSwift
    import RxCocoa
    import RxOptional
    import RxWebKit
    
    class RxWebkitViewController: UIViewController {
        @IBOutlet weak var webView: WKWebView!
        @IBOutlet weak var progressView: UIProgressView!
    
        private let disposeBag = DisposeBag()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            setupWebView()
        }
    
        private func setupWebView() {
    
            // プログレスバーの表示制御、ゲージ制御、アクティビティインジケータ表示制御で使うため、一旦オブザーバを定義
            let loadingObservable = webView.rx.loading
                .share()
    
            // プログレスバーの表示・非表示
            loadingObservable
                .map { return !$0 }
                .observeOn(MainScheduler.instance)
                .bind(to: progressView.rx.isHidden)
                .disposed(by: disposeBag)
    
            // iPhoneの上部の時計のところのバーの(名称不明)アクティビティインジケータ表示制御
            loadingObservable
                .bind(to: UIApplication.shared.rx.isNetworkActivityIndicatorVisible)
                .disposed(by: disposeBag)
    
            // NavigationControllerのタイトル表示
            webView.rx.title
                .filterNil()
                .observeOn(MainScheduler.instance)
                .bind(to: navigationItem.rx.title)
                .disposed(by: disposeBag)
    
            // プログレスバーのゲージ制御
            webView.rx.estimatedProgress
                .map { return Float($0) }
                .observeOn(MainScheduler.instance)
                .bind(to: progressView.rx.progress)
                .disposed(by: disposeBag)
    
    
            let url = URL(string: "https://www.google.com/")
            let urlRequest = URLRequest(url: url!)
            webView.load(urlRequest)
        }
    }
    
  • 좋음
  • 완전히 타이포의 가능성이 없어졌다
  • 컴파일 오류로 찾을 수 있습니다

  • 직관적으로 쓸 수 있다.
  • webView.rx.title 그런데, navigationItem의 title에 bind하고 있는구나라고 하는 것이 곧 알 수 있다



  • 요약


  • RxWebKit를 사용하면 알기 쉽게 UI를 처리 할 수있게되었습니다

    Notes


  • 이번에는 소개하지 않지만 RxWebKit 에는 canGoBack canGoForward 등 더 많은 매개 변수가 있습니다.
  • 자세한 것은 htps : // 기주 b. 코 m / Rx ぃft
  • 좋은 웹페이지 즐겨찾기