未调用UIWebView webViewDidLoadFinish方法

时间:2014-06-19 11:40:59

标签: ios uiwebview 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")
    }
}

6 个答案:

答案 0 :(得分:20)

试试这个!

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

答案 1 :(得分: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永远不会被调用。

然后我们如何解决?

在支持方面,我们必须在标头中定义内容类型作为文档。它就像魅力一样。

  

因此,请确保您的服务器后端也是如此。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

这是我在 SWIFT 3 中遇到同样问题的2美分:

public void show(View view) throws UnknownHostException {    
    WifiManager wm =
        (WifiManager)getSystemService(Context.WIFI_SERVICE);

    if (!wm.isWifiEnabled()) {
        wm.setWifiEnabled(true);
    }

    int ip = wm.getConnectionInfo().getIpAddress();
    String s = Integer.toString(ip);
    EditText et = (EditText) findViewById(R.id.my_name);
    et.setText("" + ip);
} 

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

java.lang.IllegalStateException: Could not execute method for android:onClick
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
    at android.view.View.performClick(View.java:5207)
    at android.view.View$PerformClick.run(View.java:21177)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5441)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)
Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
    ... 9 more
Caused by: java.lang.SecurityException: WifiService: Neither user 10170 nor current process has android.permission.ACCESS_WIFI_STATE.
    at android.os.Parcel.readException(Parcel.java:1620)
    at android.os.Parcel.readException(Parcel.java:1573)
    at android.net.wifi.IWifiManager$Stub$Proxy.getConnectionInfo(IWifiManager.java:1125)
    at android.net.wifi.WifiManager.getConnectionInfo(WifiManager.java:1315)
    at com.example.shankey.chatoz.MainActivity.show(MainActivity.java:28)
    ... 11 more⁠⁠⁠⁠

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

答案 5 :(得分:1)

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

类声明中的

1)写下 UIWebViewDelegate 。例如:

类MyViewController:UIViewController, UIWebViewDelegate {

2)当然在storyboard中链接到你的UIViewController,如下所示: @IBOutlet weak var webView:UIWebView!

在func viewDidLoad中添加一行

3) self.webView.delegate = self

没有更多。特别想到LinusGeffarth和LLIAJLbHOu的想法。