未调用 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