【问题标题】:UIWebView webViewDidLoadFinish method not called未调用 UIWebView webViewDidLoadFinish 方法
【发布时间】:2014-06-19 11:40:58
【问题描述】:

今晚我一直在使用 swift 中的网络视图,但遇到了一些问题。

由于某种原因,我无法触发 webViewDidStartLoad 或 webViewDidFinishLoad 方法。 在我的故事板中,我有一个名为 webView 的出口链接到我的 UIWebView 元素。

有人能帮我解决我做错的事情吗?

这是我的 viewController.swift 文件:

import UIKit

class ViewController: UIViewController, UIWebViewDelegate {

    @IBOutlet var webView : UIWebView

    var url = NSURL(string: "http://google.com")

    override func viewDidLoad() {
        super.viewDidLoad()

        //load initial URL
        var req = NSURLRequest(URL : url)
        webView.loadRequest(req)
    }

    func webViewDidStartLoad(webView : UIWebView) {
        //UIApplication.sharedApplication().networkActivityIndicatorVisible = true
        println("AA")
    }

    func webViewDidFinishLoad(webView : UIWebView) {
        //UIApplication.sharedApplication().networkActivityIndicatorVisible = false
        println("BB")
    }
}

【问题讨论】:

  • 你设置了webView的代理吗?
  • 是的,只需在您的viewDidLoad 中添加webview.delegate = self;
  • 谢谢 heaps。看起来我没有为 webview 设置代理。作为一个新手,在我读过的任何教程中都没有明确说明你必须这样做。我确实觉得这个视频很有帮助:youtube.com/watch?v=iFF1c-RgMkU

标签: ios uiwebview swift


【解决方案1】:

试试这个!

var req = NSURLRequest(URL: url)
webView.delegate = self
webView.loadRequest(req)

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,即使我确实确认了 UIWebViewDelete 并实现了它的方法。

    //Document file url
    var docUrl = NSURL(string: "https://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwjjwPSnoKfNAhXFRo8KHf6ACGYQFggbMAA&url=http%3A%2F%2Fwww.snee.com%2Fxml%2Fxslt%2Fsample.doc&usg=AFQjCNGG4FxPqcT8RXiIRHcLTu0yYDErdQ&sig2=ejeAlBgIZG5B6W-tS1VrQA&bvm=bv.124272578,d.c2I&cad=rja")
    
    let req = NSURLRequest(URL: docUrl!)
    webView.delegate = self
    //here is the sole part
    webView.scalesPageToFit = true
    webView.contentMode = .ScaleAspectFit
    webView.loadRequest(req)
    

    上述逻辑与我从快速谷歌搜索中获得的测试 URl 完美配合。

    但是当我用我的替换时。 webViewDidFinishLoad 永远不会被调用。

    那么我们是如何解决的?

    在后台,我们必须在标题中定义 content-type as document。它就像魅力一样。

    所以请确保您的服务器后端也是如此。

    【讨论】:

      【解决方案3】:

      这是我在 SWIFT 3 中与同样问题作斗争的 2 美分:

      class HintViewController: UIViewController, UIWebViewDelegate
      

      以这种方式声明委托方法(注意参数的声明):

      func webViewDidStartLoad(_ webView: UIWebView)
      func webViewDidFinishLoad(_ webView: UIWebView)
      

      记得在 Interface Builder 中将 self 设置为 webview 的 delegate 属性(选择 webview,从 Connections Inspector 的代理出口拖到 webview 或 以编程方式: self.webview.delegate = self)

      【讨论】:

        【解决方案4】:

        正如其他人所说,设置 UIWebView 的委托并遵守 UIWebViewDelegate 协议是目前最好的解决方案。

        【讨论】:

          【解决方案5】:

          对于可能在这里成功的其他人。我将我的委托方法放在了一个 private extension 中,委托调用者无法访问它。一旦我将扩展名更改为internal,代表就开始被正确调用。

          【讨论】:

            【解决方案6】:

            这里有我针对 Swift 3 的详细解决方案:

            1) 在类声明中写入UIWebViewDelegate。例如:

            类 MyViewController: UIViewController, UIWebViewDelegate {

            2) 当然在情节提要中像这样链接到您的 UIViewController: @IBOutlet weak var webView: UIWebView!

            3) 在 func viewDidLoad 中添加一行: self.webView.delegate = self

            仅此而已。特别向 LinusGeffarth 和 LLIAJLbHOu 提出想法。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-01-31
              • 2011-05-02
              • 2017-05-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-04-04
              相关资源
              最近更新 更多