未调用 UIWebView webViewDidLoadFinish 方法

Posted

技术标签:

【中文标题】未调用 UIWebView webViewDidLoadFinish 方法【英文标题】:UIWebView webViewDidLoadFinish method not called 【发布时间】: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 【参考方案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 提出想法。

【讨论】:

以上是关于未调用 UIWebView webViewDidLoadFinish 方法的主要内容,如果未能解决你的问题,请参考以下文章

iOS 4.3 中未调用 UIWebView shouldStartLoadWithRequest

PDF uiwebview 加载时未显示活动指示器

UIWebView加载页面

当 UIWebView 打开 PDF 时 webViewDidFinishLoad 未触发

UIWebview 未检测到链接

UIWebView 中未显示键盘