web-dev-qa-db-ja.com

SwiftのUIWebViewでUIActivityIndi​​catorViewを使用する

URLがWebViewにロードされているときに、アプリのアクティビティインジケータービューをユーザーに表示しようとしています。 activity.startAnimating/activity.stopAnimatingをいじってみて、関数などに配置してみましたが、うまくいきませんでした。

私が得ることができた最高のものは、アクティビティインジケーターを表示してアニメーション化することですが、URLが読み込まれるとアニメーション化を停止したり非表示にしたりしないため、Webページの上で回転し続けます。

他の状況で、activity.startAnimatingを移動しようとすると、「スレッド1:EXC_BAD_INSTRUCTION(code = EXC_I386_INVOP、subcode = 0x0)」の問題が発生しました。属性インスペクターで[停止時に非表示]をオンにし、URLが有効であることを確認し、インターフェイスビルダー要素のIBOutletsを作成しました。

私と一緒に耐えなさい。私はSwiftに比較的慣れていません。これが私のコードです:

class HighchartsController: UIViewController {

@IBOutlet weak var HighchartsView: UIWebView!

@IBOutlet weak var activity: UIActivityIndicatorView!

@IBOutlet weak var saveButton: UIBarButtonItem!

@IBOutlet weak var highchartsMenu: UIBarButtonItem!

override func viewDidLoad()
{
    super.viewDidLoad()

    if self.revealViewController() != nil {
        highchartsMenu.target = self.revealViewController()
        highchartsMenu.action = "revealToggle:"

        loadAddress()
    }
 }

func loadAddress() {

    let url = NSURL (string: "http://google.com/flights")
    let request = NSURLRequest (URL: url!)
    HighchartsView.loadRequest(request)
    println("Webpage Loaded Successfully")
 }
}

そして、私は次のようなさまざまな機能を使用してみました

webViewDidStartLoad(_ :UIWebView){

    activity.startAnimating()
    NSLog("Webview load has started")

}
webViewDidFinishLoad(_ :UIWebView){

    activity.stopAnimating()
    NSLog("Webview load had finished")

}
12
agwin27

まず、UIWebViewの委任が表示されません。委任プロセスに関連する動作を実現します。

UIWebViewDelegateには4つのメソッドがありますが、この方法では3つだけ使用します。

スウィフト4

func webViewDidStartLoad(_ webView: UIWebView) // show indicator    
func webViewDidFinishLoad(_ webView: UIWebView) // hide indicator
func webView(_ webView: UIWebView, didFailLoadWithError error: Error) // hide indicator

スウィフト3

func webViewDidStartLoad(webView: UIWebView!) // show indicator
func webViewDidFinishLoad(webView: UIWebView!) // hide indicator
func webView(webView: UIWebView!, didFailLoadWithError error: NSError!) // hide indicator
27
dimpiax

そのようにクラスにUIWebViewDelegateを追加する必要があります。

class HighchartsController: UIViewController, UIWebViewDelegate {

同様に、viewDidLoad関数でwebViewデリゲートをselfに割り当てる必要があります。

HighchartsView.delegate = self
4
Jackson

* Dmpiax回答に相当するWKWebView。 WKNavigationDelegateを使用する

func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) // show indicator 

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)  // hide indicator 

func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error)  // hide indicator*  
4
Parion

以下は、UIWebViewページ読み込みインジケーターを実装するために、常にXcode 8/Swift 3/iOS 1で実行する3つの簡単な手順です。

ステップ1。ViewControllerクラスにWebビューおよびロードインジケーターのアウトレットを作成します。例えば:

@IBOutlet var loadSpinner: UIActivityIndicatorView!
@IBOutlet weak var webView: UIWebView!

これらの2行の左側には空でないドットが必要です。

ステップ2。ストーリーボードで:Controlキーを押しながらWebViewをViewControllerにドラッグし、メニューから[delegate]を選択します。 GarySaboが正しく指摘したように、このステップがないと、インジケーターは表示されますが機能しません!

ステップ3。ViewControllerクラスに次のコードを追加します。

func webViewDidStartLoad(_ : UIWebView) {
    loadSpinner.startAnimating()
}

func webViewDidFinishLoad(_ : UIWebView) {
    loadSpinner.stopAnimating()
}
3
Nick Ivanov

もう理解できたと思いますが、コントロールドラッグでストーリーボードのデリゲートをUIWebViewとして設定するには、UIViewControllerを接続する必要があります。

3
GarySabo

WKWebViewを使用している場合は、WKNavigationDelegateを次のように設定します。

webView.navigationDelegate = self

func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
    //Show loader
}    
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    //Hide loader
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
    //Hide loader
}
0

Swift 5の更新

最初に、次のようにwebViewデリゲートを設定する必要があります。

webView.navigationDelegate = self

そして、あなたはこのメソッドを呼び出すでしょう:

extension ExampleViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        // show activity indicator
    }

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        // hide activity indicator
    }
    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
        // hide activity indicator
    }
}
0
NicolasElPapu