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")
}
まず、UIWebViewの委任が表示されません。委任プロセスに関連する動作を実現します。
UIWebViewDelegateには4つのメソッドがありますが、この方法では3つだけ使用します。
func webViewDidStartLoad(_ webView: UIWebView) // show indicator
func webViewDidFinishLoad(_ webView: UIWebView) // hide indicator
func webView(_ webView: UIWebView, didFailLoadWithError error: Error) // hide indicator
func webViewDidStartLoad(webView: UIWebView!) // show indicator
func webViewDidFinishLoad(webView: UIWebView!) // hide indicator
func webView(webView: UIWebView!, didFailLoadWithError error: NSError!) // hide indicator
そのようにクラスにUIWebViewDelegateを追加する必要があります。
class HighchartsController: UIViewController, UIWebViewDelegate {
同様に、viewDidLoad関数でwebViewデリゲートをselfに割り当てる必要があります。
HighchartsView.delegate = self
* 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*
以下は、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()
}
もう理解できたと思いますが、コントロールドラッグでストーリーボードのデリゲートをUIWebView
として設定するには、UIViewController
を接続する必要があります。
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
}
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
}
}