【问题标题】:Using UIActivityIndicatorView with UIWebView in Swift在 Swift 中使用 UIActivityIndi​​catorView 和 UIWebView
【发布时间】:2015-06-06 17:54:06
【问题描述】:

我正在尝试在我的应用程序中向用户显示活动指示器视图,同时将 url 加载到 WebView 中。我尝试过使用 activity.startAnimating/activity.stopAnimating 并尝试将它们放在函数等中,但没有任何运气。

我能得到的最好的结果是活动指示器显示和动画,但一旦我的 url 加载后就不会停止动画或隐藏,因此它会继续在网页顶部旋转。

在其他情况下,在尝试移动 activity.startAnimating 时,我遇到了“线程 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)”问题。我在属性检查器中检查了“停止时隐藏”,我知道我的 url 是有效的,并且我已经为 Interface Builder Elements 创建了 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")

}

【问题讨论】:

    标签: swift uiwebview progress uiactivityindicatorview


    【解决方案1】:
    extension WebViewController: WKNavigationDelegate {
        
        func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
            print("Start loading")
            LoadingIndicator.show()
        }
        
        func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
            print("End loading")
            LoadingIndicator.hide()
        }
    }
    

    调用委托方法。它工作正常。

    【讨论】:

      【解决方案2】:

      如果您使用的是 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
      }
      

      【讨论】:

        【解决方案3】:

        *WKWebView 等效于 dimpiax 答案。使用 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 现在已弃用,我们必须使用 WKWebView,此代码现在是解决方案。但不要忘记在 viewDidLoad 添加 webView.navigationDelegate = self 。谢谢帕里昂
        【解决方案4】:

        首先,我没有看到 UIWebView 的委托。 了解您与委派过程相关的行为。

        UIWebViewDelegate 有四个方法,但这种方式只有三个:

        斯威夫特 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
        

        【讨论】:

        • 在'class HighchartsController: UIViewController'之后添加UIWebViewDelegate和添加'highchartsView.delegate = self'之外,我如何委托UIWebview?抱歉,我是 Swift 和 Xcode 的新手。
        • @agwin27 你需要将 UIWebview 的协议 UIWebViewDelegate 委托给你的类,并在订阅的协议中实现内部描述的功能 - UIWebViewDelegate
        【解决方案5】:

        以下是我在 Xcode 8 / Swift 3 / iOS 10 中始终遵循的三个简单步骤,以实现 UIWebView 页面加载指示器:

        步骤 1.ViewController 类中为 Web 视图和负载指示器创建出口。例如:

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

        这两行的左边应该有非空点。

        第 2 步。 在 Storyboard 中:按住 Control 键将 WebView 拖到 ViewController 并从菜单中选择“委托”。正如 GarySabo 正确指出的那样,没有这一步,指示器会出现但不起作用!

        第 3 步。 将以下代码添加到您的 ViewController 类:

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

        【讨论】:

          【解决方案6】:

          你需要像这样将 UIWebViewDelegate 添加到你的类中。

          class HighchartsController: UIViewController, UIWebViewDelegate {
          

          您还需要像这样在 viewDidLoad 函数中将 webView 委托分配给 self。

          HighchartsView.delegate = self
          

          【讨论】:

          • 应该是 UIWebViewDelegate 而不是 UIWEBViewDelegate
          • 小疏忽。谢谢。
          【解决方案7】:

          我相信您现在已经弄清楚了,但是您需要连接您的 UIWebView 以通过控制拖动将其代表设置为情节提要中的 UIViewController

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多